VFP9 Firebird Stored Procedure Bucle

125 views
Skip to first unread message

Eric Natareno Guerra

unread,
Sep 30, 2015, 7:02:19 PM9/30/15
to publicesvfoxpro

Buenas tardes amigos, nuevamente acudiendo a sus conocimientos para que me echen una mano en este asunto. El problema es el siguiente:

Tengo un cursor que obtengo de una tabla de firebird en un grid, en él el usuario debe seleccionar dando doble click sobre los ítems deseados una especie de agrupación que lo único que hace es colocarle 1 en un campo o columna llamado marca, hasta allí todo bien, el problema que tengo es que tengo un SP en firebird que graba un encabezado de factura y genera el ID de la transacción, pero lo que necesito es que inmediatamente después de grabar el encabezado me actualice algunos campos de la tabla de donde obtuve el cursor en el mismo Stored Procedure.

Dicho de otra forma

Tengo tabla TICKETS de despacho pueden ser varios y se deben relacionar con una factura (Tabla FAC_COMP

En fox con hacer un scan sobre el cursor resolvería el problema, pero necesito hacerlo en un SP de Firebird, primero grabar encabezado y luego actualizar los ítems seleccionados, pero no se como hacerlo, si alguien de ustedes ha hecho algo similar le agradecería su ayuda. Muchas gracias de antemano.

 

 

Esteban H

unread,
Sep 30, 2015, 7:33:41 PM9/30/15
to publice...@googlegroups.com

Hola Eric.

Tenés q tener 2 SP uno p actualizar la tabla Maestra y otro p actualizar la tabla de Items. Si la tabla de encabezado no es modificada, solo te quedas en tu programa con el Id Maestro, p actualizar la tabla Items. Yo lo q haría es borrar los registros en la tabla ítems relacionada con ID de la Maestro y con un Scan Endscan  recorro los ítems y los grabo con el sp_GrabarItems.

 

Saludos.

 

Esteban.

Eric Natareno Guerra

unread,
Sep 30, 2015, 7:42:10 PM9/30/15
to publicesvfoxpro
Gracias esteban, asi es como lo tengo, Ejecuto un SP para insertar el encabezado de la factura y con un scan..endscan recorro el cursor y actualizar las filas en la tabla de tickets, pero mi pregunta es si se puede hacer esto  en un solo  SP, deberia de haber alguna forma de indicarle a firebird que recorra un cursor pero esa es mi duda 

Esteban H

unread,
Sep 30, 2015, 8:02:25 PM9/30/15
to publice...@googlegroups.com

No Eric.

Vos tenes q pasar registro x registro, no podes pasar un cursor completo a FB, a no ser q lo importes en txt q no es este el caso.

Lo q yo hago es abro una transacción, actualizo maestro de ser necesario, actualizo demás tablas y si todas las actualizaciones son correctas hago commit cerrando la transacción.

Víctor Hugo Espínola Domínguez

unread,
Sep 30, 2015, 8:24:27 PM9/30/15
to publice...@googlegroups.com
Hola Eric

Si quieres resolverlo con un solo stored procedure te lanzo 2 ideas:

1) SP recibe desde VFP 2 parámetros: Nro o ID de Factura y un string conteniendo los ID de los items del ticketc encadenados a longitud constante, por ejemplo: "000012340000123700001244", aquí estás indicando que debe actualizar los items 1234, 1237 y 1244.
En el SP haces un ciclo, la cantidad de veces lo calculas por la longitud de la lista dividido por la longitud de cada item (8 en este ejmplo).

Antes del ciclo creas una variable
Declare lcUpdate Varchar(200) =
    'Update Tickets Set Nro_Factura =  :lcNro_Factura 'Where Tickets.ID_Ticket = :lcID_Ticket''

En el cuerpo de ciclo ejecutas la sentencia
Execute Statement (lcUpdate) (lcNro_Factura := :pNro_Factura, :lcID_Ticket := :pID_Ticket)

2) Creas una tabla en el servidor "Tickets_Factura" con 3 campos: Guid_TickFact Char(32), ID_Ticket TipoTicket, Nro_Factura TipoNroFactura)
En VFP insertas los registros en esa tabla previo cálculo de Guid_TickFact y luego llamas al SP de Firebird enviando como parámetro Guid_TickFact, en el servidor haces el update relacionando Tickets con Tockets_Factura.


Saludos,
Víctor.
Lambaré - Paraguay.

Eric Natareno Guerra

unread,
Sep 30, 2015, 11:21:51 PM9/30/15
to publice...@googlegroups.com

Gracias Esteban y Victor Hugo, con sus comentarios ya me hice una idea más amplia y le daré la mejor solución, agradezco en gran manera su ayuda. Saludos

Antonio Meza

unread,
Oct 1, 2015, 9:50:13 AM10/1/15
to Comunidad de Visual Foxpro en Español
Hola !!

Veo que usas SP para cosas muy sencillas, en lo personal los usaría en procesos grandes, ya que en cosas tan sencillas como es tu caso sera mas difícil armar los SP que realizar unos sencillos Updates.

Una pregunta porque la necesidad de usar SP? y leyendo tu comentario inicial que pasa si el usuario decide ya no hacer la factura de los Tickets seleccionados cuando ya guardaste el encabezado?

saludos
Antonio Meza

Víctor Hugo Espínola Domínguez

unread,
Oct 1, 2015, 11:42:41 AM10/1/15
to publice...@googlegroups.com
Hola Eric

Aquí tienes otra forma:
Set Term ^ ;
Create Procedure "Tickets_Factura"(
/*  Lista de IDs de Tickets, 6 caracteres con ceros a la izquierda
    separados por coma o punto y coma
    Ejemplo: '000012,000016,000123'
*/
  Lst_ID_Tickets Varchar(600) Not Null,
  Nro_Factura    Char(12)     Not Null)
As
Begin

  Update Tickets tik
     Set tik.Nro_Factura = :Nro_Factura
   Where Exists (Select 1
              From rdb$database
              Where Position(Lpad(Cast(tik.ID_Ticket As Varchar(6)), 6, '0')
                               , :Lst_ID_Tickets) > 0) ;
End;
Set Term ; ^


Saludos,
Víctor.
Lambaré - Paraguay.


Eric Natareno Guerra

unread,
Oct 1, 2015, 1:38:04 PM10/1/15
to publice...@googlegroups.com

Antonio, es por eso mi pregunta, pues al hacer todo el procedimiento en un Sp no pasaría lo de grabar sólo el encabezado, con respecto a porque un Sp? sacame de la duda es más rápido? es más seguro?, pues de otra forma lo haré programando el insertar y los updates en el cliente, gracias por tus comentarios

Eric Natareno Guerra

unread,
Oct 1, 2015, 1:43:31 PM10/1/15
to publice...@googlegroups.com

Gracias Víctor Hugo, si que me has regalado de tu tiempo, por lo que veo en los ejemplos que amablemente me has enviado, la única forma de indicarle al servidor cuales items deseo actualizar es por medio del string, no existe la forma de que fuera como un cursor. Te agradezco muchísimo amigo los ejemplos, voy a probar a ver que pasa. Saludos

Reply all
Reply to author
Forward
0 new messages