Error en el tercer intento de un cursor VFP

Buenas nuevas ingeniero, aquí con la pena preguntando anticipadamente a las otras consultas que le hago.

Y en esta ocasión es con los cursores, resulta lo siguiente y como ya bien mencionado tengo 2 tablas relación uno a muchos llave principal --> dbf_empresas(id_empresa) llaves regulares --> dbf_clientes(id_empresa,id_cliente,id_aval)

anteriormente en otros proyectos lo hacia de manera sencilla y a lo que me refiero sencilla es por dar un ejemplo con una tabla clientes y otra facturas uno a muchos relación entre ambas id_cliente la cual filtraba sin ninguna situación, ahora me la quireo complicar un poco mas y para mi al menos para mi esta algo enredoso y creo que las siguientes lineas de código si fueran una imagen parecerían un espagueti y ya veras por que lo digo

lo que deseo hacer es que al momento de añadir cliente no simplemente me reemplace el valor dbf_clientes.id_empresa con dbf_empresas.id_empresa para hacer la relación uno a muchos sino que también tenga un consecutivo de cada cliente es decir un ejemplo

si tengo

TABLA DBF_EMPRESA

id_empresa Empresa

1 PATITO

2 PATITO 2

TABLA DBF_CLIENTES

id_empresa id_cliente nomCliente

1 1 WOLVERINE

1 2 SUPERMAN

1 3 BATMAN

2 1 LA MUJER TARAVILLA

2 2 ROBIN

2 3 LINTERNA VERDE

2 4 EL CHAPULIN COLORADO :)

pero lo estoy intentando de la siguiente manera funcionando hasta los 2 primeros registros añadidos de cada empresa ya sea PATITO O PATITO 2 pues al tercer intento para añadir un nuevo registro sea cual sea de las empresas me manda error "index tag is not found"

hay alguna manera mas sencilla de hacer lo que intento hacer? O si este es el método que estoy haciendo mal en mi espagueti?

a continuación el código que emplee en un command button no sin antes hacerte mención que primeramente en un combobox esta la lista de las empresas para lo cual primeramente selecciono la empresa y ya luego clickeo en el command button para que haga lo siguiente:

&&Con la intención que me seleccione el ultimo registro filtrado por id_empresas con la finalidad que al añadirlo con el append from copie solo un registro

SELECT TOP 1 id_cliente FROM dbf_clientes ;
where id_empresa = dbf_empresas.id_empresa INTO CURSOR temporal NOFILTER READWRITE;
order by id_cliente DESC


&& selecciono el cursor temporal para indexarlo, ordenarlo por id_cliente y añadirle el valor consecutivo tomado de la tabla cliente filtrado por dbf_empresas.id_empresa

SELECT temporal
INDEX ON id_cliente to temporal
SET ORDER TO id_cliente
GO BOTTOM
INSERT INTO temporal (id_cliente);
values (id_cliente + 1)
RECNO()

&&ahora si selecciono nuevamente la tabla clientes y le añado lo que contiene el cursor

SELECT dbf_clientes
APPEND FROM DBF ("temporal")
replace dbf_clientes.id_empresa WITH dbf_empresas.id_empresa
SELECT temporal
USE IN ("temporal")
thisform.Refresh

y si funciona bien como te digo en los dos primeros intentos para añadir un registro al tercero el error me lo marca en la linea SET ORDER TO id_cliente

que hago?? Me podrías ayudar Ingeniero: te estaré enormemente agradecido.

saludos y bendiciones

1 Respuesta

Respuesta
1

Ahhh no te preocupes! Puedes hacerme las consultas que quieras... si tengo la respuesta, te ayudare. Si no.. pues también tratare de ayudarte! :) A ver a ver a ver... viene un poco enredada la pregunta si.. Comprendo que tenes 2 tablas y quieres sustituir el valor de una en la otra... pero explicame un poco mejor para poder ayudarte... :D :D :D :¿D cómo es la inserción de datos que pretendes hacer?

Ok tengo 2 tablas (dbf_empresas y dbf_clientes),esta es la estructura importante de ellas;

dbf_empresas

id_empresa(index primario)

empresa(index regular)

dbf_clientes

id_empresa(index regular)

id_cliente (index regular)

en la tabla dbf_empresas tengo por dar el mismo ejemplo de arriba 3 registros en dicha tabla;

id_empresa empresa

1 PATITO

2 PATITO 2

3 PATITO 3

al añadir registros mediante comandos SQL a la tabla dbf_clientes quiero que me inserte registros con el mismo id_empresas de la tabla dbf_empresas a id_empresas de la tabla dbf_clientes pero que ademas de eso me genere un consecutivo por id_cliente como el siguiente ejemplo

en la tabla dbf_clientes

id_empresa id_cliente

1 1

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

1 10

1 11

2 1

2 2

2 3

3 1

3 2

3 3

3 4

3 5

3 6

así de sencillo (según yo) entonces ya en la practica en la tabla dbf_empresas tengo 3 registros añadidos que como te decía son valores preestablecidos, sin embargo en la tabla dbf_clientes la tabla estará vacía y así fue como en el formulario tengo un combobox con los valores o registros de la tabla dbf_empresas del cual selecciono la que yo quiera ya después en un botón escribí el código siguiente código que es al que te hice mención que si funciona relativamente pues al tercer inteno de registro sea cual sea de las empresas que haya seleccionado me manda error el cual lo marca en la linea SET ORDER TO id_cliente, lo que se me hace raro ya que si lo hizo bien en el primero y en el segundo, los demás registros no tendrían por que dar problemas en lina de código, lo siguiente es lo que tiene el botón.

SELECT TOP 1 id_cliente FROM dbf_clientes ;

where id_empresa = dbf_empresas.id_empresa INTO CURSOR temporal NOFILTER READWRITE;

order by id_cliente DESC

SELECT temporal INDEX ON id_cliente to temporal

SET ORDER TO id_cliente

GO BOTTOM

INSERT INTO temporal (id_cliente);

values (id_cliente + 1)

RECNO()

SELECT dbf_clientes APPEND FROM ("temporal")

replace dbf_clientes.id_empresa WITH dbf_empresas.id_empresa SELECT temporal USE IN ("temporal")

thisform.Refresh

Disculpa la tardanza. Ya comprendo! Para eso, lo que debemos hacer es simple: necesitamos saber, POR CADA EMPRESA, cuantos registros hay. Si por ejemplo, vas a ingresar un registro para la empresa 2 y en la tabla ya hay 4 clientes registrados con ese mismo id(2), entonces le decimos a fox que cuente cuantos registros (clientes) hay con 2 y que sume uno mas, así:

LOCAL lnVar1, lnTotReg

SELECT dbf_clientes

COUNT FOR(id_empresa) = 2 TO lnVar1

lnTotReg = lnVar1 + 1

Luego, sustituyes el valor en el id_ cliente y listo. :) Prueba y me avisas! :)

Hola Buenas Tardes, no hay problema así pasa al contrario gracias por tu ayuda y bueno te comento que analice tu código pero no me funciona así fue como lo use;

LOCAL lnVar1, lnTotReg
SELECTdbf_clientes
COUNT FOR (id_empresa) = 2 TO lnVar1
lnTotReg = lnVar1 + 1

INSERT INTO dbf_clientes(id_empresa, id_cliente);
values (lnVar1, id_cliente + 1)

deje el mismo valor 2 para hacer pruebas de funcionamiento

no se si mal emplee lo que me hiciste favor de enviarme o no se como aplicarlo por que si me añade el registro y si agrega el id_empresa pero no me añade el consecutivo sino que todos los id_cliente los deja como numero 1

Hola buenos días, te comento que resolví la situación acá te dejo el código para que lo

tengas, primeramente selecciono desde un combobox la empresa y el cursor se detiene en el, ya luego clickeo en un botón añadir el cual tiene el código donde secuencialmente selecciona de la tabla dbf_clientes todos los coincidentes iguales a id_empresa y todo lo pone en un cursor llamado temporal, en seguida selecciona el cursor, lo indexa unicamente por id_cliente, y lo ordena por el mismo campo, luego se va al final del registro e inserta un nuevo valor y lo suma, si la tala esta vacía el valor es 0,entonces el secuencial seria 1, si no esta vacía y lo filtra por la cantidad de coincidencias por ejemplo 16 el siguiente es 17

ya luego reemplazo el valor id_empresa del cursor temporal por el valor de dbf_empresas.id_empresa el cual sigue ahí posicionado

añado un nuevo campo a la tabla dbf_clientes y lo reemplazo con el ultimo registro del cursor llamado temporal.

ya hice la prueba con mas de 100 registros seleccionando diferentes dbf_empresas.id_empresa y lo hace como lo necesito creo y a lo mejor mi problema era que en append blank --> APPEND FROM ("temporal") no lo usba correctamente o quien sabe, nunca me puse a analizar en donde fue mi error simplemente me limite a tratar de hacerlo funcionar con muchas pruebas de funcionamieno incluyendo la que me hiciste favor de enviar y hablando precisamente de eso, me gustaría si no fuera mucha molestia si aun sigue abierta esta consulta para que me digas con tu manera como te referías a usar el contador, para tenerlo por si acaso alguna vez lo ocupo, espero no haya ningún inconveniente.

SELECT * FROM dbf_clientes;
where id_empresa = dbf_empresas.id_empresa INTO CURSOR temporal NOFILTER READWRITE

SELECT temporal
INDEX ON id_cliente to temporal ASCENDING
SET ORDER TO id_cliente
GO BOTTOM
INSERT INTO temporal(id_cliente);
values(id_cliente + 1)

replace temporal.id_empresa WITH dbf_empresas.id_empresa
APPEND BLANK IN dbf_clientes

replace dbf_clientes.id_empresa WITH pClientes.id_empresa
replace dbf_clientes.id_cliente WITH pClientes.id_cliente

Saludos...

Pues la variable iba a ser usada para el campo id_cliente. Veo que la usaste en id_empresa y dejaste el cliente tal cual tu lo tenias. :O

je je je bueno, pues es bueno contar con tu apoyo incondicional y desinteresado muchas gracias de verdad por echarme la mano, que buen amigo eres!!!

saludos desde Guanajuato, Mexico, estoy a tus ordenes en lo que de igual manera pueda echarte la mano te dejo mi correo

[email protected] muchas gracias por todo.

saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas