Como grabar en varias tablas con foxydb en mariadb

292 views
Skip to first unread message

alvarocastellar

unread,
Sep 28, 2017, 9:28:41 PM9/28/17
to Comunidad de Visual Foxpro en Español
Buenas noches a todos, sigo trabajando con foxydb y mariabd mi nuevas consulta es como seria el procedimiento para grabar en varias tablas al tiempo por ejemplo el proeso de venta de un articulo en donde por lo general se tiene un maestro de articulos que contiene la existencia, otra tabla que graba el encabezado del la venta y unas mas de detalle que contiene el cuerpo de la factura, alguien me puede indicar cual seria el procedimiento correcto??. que comandos y en que orden ejecutarlo?

Gracias por su ayuda.

Alvaro castellar

Antonio Meza

unread,
Sep 29, 2017, 2:38:28 PM9/29/17
to Comunidad de Visual Foxpro en Español
Hola!!!

Lo normal seria así!!

* Revisar si hay cambios en algún cursor
If odb.Changes()
LOCAL _registroNuevo as Integer
* Tabla Principal
if odb.CursorChanges("principal")
odb.update(principal,.t.)
_registroNuevo = odb.id_last
ENDIF
* Tabla de Detalles
if odb.CursorChanges("Detalles")
* Verificar si es registro nuevo el Principal
IF _registroNuevo <> 0
* Asignar Ultimo ID a los registros del detalle
replace detalles.idprincipal WITH _registroNuevo ALL IN detalles
ENDIF
odb.update(principal)
ENDIF
else
    * No se ha hecho ningún cambio
endif

saludos
Antonio Meza

Antonio Meza

unread,
Sep 29, 2017, 2:41:07 PM9/29/17
to Comunidad de Visual Foxpro en Español
Me falto el Commit jajajaja

* Revisar si hay cambios en algún cursor
If odb.Changes()
LOCAL _registroNuevo as Integer, _hayCambios as Boolean
* Tabla Principal
if odb.CursorChanges("principal")
_hayCambios = .t.
odb.update(principal,.t.)
_registroNuevo = odb.id_last
ENDIF
* Tabla de Detalles
if odb.CursorChanges("Detalles")
_hayCambios = .t.
* Verificar si es registro nuevo el Principal
IF _registroNuevo <> 0
* Asignar Ultimo ID a los registros del detalle
replace detalles.idprincipal WITH _registroNuevo ALL IN detalles
ENDIF
odb.update(principal)
ENDIF
* Guardar Cambios
IF _hayCambios = .t.
odb.Commit()
ENDIF
else
    * No se ha hecho ningún cambio
endif


saludos
Antonio Meza

alvarocastellar

unread,
Sep 29, 2017, 3:46:50 PM9/29/17
to Comunidad de Visual Foxpro en Español
Nuevamente gracias antonio por la respuesta y a todos los participantes de este excelente grupo, aprovechando este hilo tengouna consulta  mas:
Como se manejan los diferentes consecutivos que usa el programa por ejemplo el consecutivo de facturacion, el consecutivo de entradas(no hablo del Id, sino el consecutivo que ve el usuario).  en vfp lo que hacia era bloquear  la tabla de consecutivos mientras el usuario hacia la peticion y sumaba 1 a ese consecutivo, aca se maneja igual o como seria la mejor forma

Saúl Piña

unread,
Sep 29, 2017, 4:00:52 PM9/29/17
to Comunidad de Visual Foxpro en Español
Siguiendo  con foxydb, tiene un ejemplo de como puedes trabajar con correlativos con el mismo foxydb.

Saludos!

Antonio Meza

unread,
Sep 29, 2017, 4:42:18 PM9/29/17
to Comunidad de Visual Foxpro en Español
FoxyDb tiene una función .CODE() que facilita enormemente este proceso, es parecido a lo que comentas realiza el bloqueo de un registro en una tabla para obtener el correlativo, por lo que es super importante que este proceso lo hagas cuando ya no sea necesaria la intervención del usuario, es decir cuando presiones el botón de guardar.

Puedes usar una tabla para todos los correlativos o puedes usar una tabla para cada correlativo, en mi caso prefiero una tabla para cada correlativo, aunque MariaDb solo bloquea el registro de la tabla y no toda.

Si revisas el código fuente de FoxyDb ahí esta documentado los parámetros de cada función.

PROCEDURE Code
LPARAMETERS __tableName as Character, __fieldNameToIncrease as Character, __fieldName as Character, __fieldValue as Character, __defaultValue as Integer, __defaultValueChange as Boolean


* Code
* Obtener Códigos Únicos (Correlativos)
* Parámetros
* __tableName, Nombre de la Tabla Real en el servidor
* __fieldNameToIncrease, Nombre del campo a incrementar su valor
* __fieldName, Lista de Campos para usar como filtro o agregar registro
* __fieldValue, Lista de Valores para el filtro o agregar registro
* __defaultValue, Valor inicial del contador
* __defaultValueChange, Si remplaza el valor aun cuando ya existe
* Valor devuelto
* true Código Generado
* false Código NO Generado

Ejemplos:

* Tabla sin campos adicionales
     odb.Code("Facturas_folios", "folio")

* Tabla sin campos adicionales y que inicie en el filio 100
     odb.Code("Facturas_folios", "folio", "", "", 100)

* Tabla manejando Serie de Factura
     odb.Code("Facturas_folios", "folio", "serie", "'A'")

NOTA: Checa las comillas simples, pues son importantes para determinar el tipo del valor del campo "  'A'  "

* Tabla manejando Serie de Factura por Sucursal
     odb.Code("Facturas_folios", "folio", "idsucursal, serie", "1, 'A'")

NOTA: Los valores numéricos no van entre comillas simples, los alfanuméricos si!!!

odb.Code() te devuelve .t. o .f., para saber que valor obtuvo es por medio de la propiedad

id_Code = 0  && Numero de código único generado por la función .CODE()

if odb.Code("............)
    ? odb.id_Code
endif

saludos
Antonio Meza

El viernes, 29 de septiembre de 2017, 14:46:50 (UTC-5), alvarocastellar escribió:

Antonio Meza

unread,
Sep 29, 2017, 4:53:00 PM9/29/17
to Comunidad de Visual Foxpro en Español
Te paso el ejemplo Completo usando Code()

* Revisar si hay cambios en algún cursor
If odb.Changes()
LOCAL _registroNuevo as Integer, _hayCambios as Boolean
* Tabla Principal
if odb.CursorChanges("principal")
_hayCambios = .t.
IF principal.id = 0
* Es un registro nuevo, obtener Codigo Unico
odb.code("principal_folio", folio)
replace principal.folio WITH PADL(odb.id_Code, 10, "0") IN principal
* Nota el campo principal.folio debe ser caracter NO Numerico
* 0000000001
ENDIF
odb.update(principal,.t.)
_registroNuevo = odb.id_last
ENDIF
* Tabla de Detalles
if odb.CursorChanges("Detalles")
_hayCambios = .t.
* Verificar si es registro nuevo el Principal
IF _registroNuevo <> 0
* Asignar Ultimo ID a los registros del detalle
replace detalles.idprincipal WITH _registroNuevo ALL IN detalles
ENDIF
odb.update(principal)
ENDIF
* Guardar Cambios
IF _hayCambios = .t.
odb.Commit()
ENDIF
else
    * No se ha hecho ningún cambio
endif

saludos
Antonio Meza

alvarocastellar

unread,
Sep 29, 2017, 4:53:53 PM9/29/17
to Comunidad de Visual Foxpro en Español
Super!! amigo antonio,  es preciso lo que yo requeria muchas gracias




El viernes, 29 de septiembre de 2017, 15:42:18 (UTC-5), Antonio Meza escribió:

Antonio Meza

unread,
Sep 29, 2017, 5:01:55 PM9/29/17
to Comunidad de Visual Foxpro en Español
Excelente!!!

Por cierto la estructura de la tabla principal_folios debe tener los nombre de los campos que usas para el filtro y el campo Folio debe ser Numérico, puedes usar los nombre que quieras, uso Folio porque es mas demostrativo jajajaja

* Tabla manejando Serie de Factura por Sucursal
     odb.Code("Facturas_folios", "folio", "idsucursal, serie", "1, 'A'")

Ejemplo de estructura de la tabla

Tabla: Principal_Folios
------------------------------
id                 int
idsucursal   Int
folio             int
serie            varchar

saludos
Antonio Meza

alvarocastellar

unread,
Oct 1, 2017, 3:54:13 PM10/1/17
to Comunidad de Visual Foxpro en Español
Hola amigos he estado ensayando la funcion code para el tema de los consecutivos pero no me funciona siempre devuelve 0, adjunto una imagen del contenido de mi tabal de consecutivos y explico lo que requiero y que debe funcionar para que dos usuarios no graben un evento o movimiento con el mismo numero de consecutivo

Cuando el usuario de clic en guardar el sistema debe sumar 1 al campo nume_conse, que es de tipo caracter, anteriomente le enviaba 'EN', 'VT', 'TR', segun la opcion que el usuario estuviera trabajando, esto mismo debo hacer con maria db, poder mandar el campo ID_Conse o Codi_Conse y que me devuelva el consecutivo a seguir. amigo antonio o cualquiera de los otros genios de este foro. Ayuda...
consecutivos.png

Víctor Hugo Espínola Domínguez

unread,
Oct 1, 2017, 5:11:43 PM10/1/17
to publice...@googlegroups.com
Creo que el campo nume_conse debe ser Integer

Saludos,
Víctor.
Lambaré - Paraguay.

Antonio Meza

unread,
Oct 1, 2017, 9:16:10 PM10/1/17
to Comunidad de Visual Foxpro en Español
Hola!!!

Como te dice Victor el campo Nume_Conse debe ser NUMÉRICO, porque este se va a sumar, no tiene caso que sea alfanumérico y que este rellenado de ceros ya que la única función de esta tabla es devolverte un consecutivo según el Código, incluso la descripción del código esta de mas, salvo que sea solo informativa para ti como programador pero si es para el usuario no debería estar ahí.

Como te comente arriba el campo Folio que en este caso es tu campo Nume_Conse debe ser NUMERICO!!!! y ya en tu tabla principal es donde si lo guardas como alfanumérico y rellenado de ceros.

Si te fijas en la explicación que te di uso PADL() para convertir el valor devuelto por Code() que es numérico en alfanumérico rellenado de ceros, no se si leíste con atención la explicación o no me supe explicar.

Como tu tabla de consecutivos es muy sencilla y una vez que hagas el cambio del Campo Nume_Conse a numérico ya te debe funcionar.

? odb.Code("mae_conse",nume_conse,"codi_conse","'EN'")

Nota: Un recomendación muy personal, en mi caso uso nombres completos para los nombres de las tablas y campos, pues antes en VFP con tablas libres solo te permitía el nombre de campos de 11 caracteres, pero aquí tienes esa libertad, y si los campos están bien nombrados es mas fácil que cualquier persona sepa a que se refieren e incluso para uno mismo, algo asi

Tabla: Consecutivos
------------------------------
id
codigo
descripcion
consecutivo

saludos
Antonio Meza

alvarocastellar

unread,
Oct 2, 2017, 10:38:58 AM10/2/17
to Comunidad de Visual Foxpro en Español
Hola amigos, gracias nuevamente por la ayuda, efectivamente cambie el campo a numerico y me funciono como lo requeria, muy agradecido con todos sin la ayuda de cada uno de los  participantes no llevara el proyecto de migracion tan avanzado. A Antonio a Victor y cada uno de los que se toman el trabajo de leer la inquietudes nuestras mis saludos.
Antonio y en cuanto a tu sugerencia acerca del nombre de las tablas, sucede que la base de datos viene desde Fox 2.6 cuando el concepto era de tablas libres por esa razon tiene nombres y campos cortos, las nuevas tablas que he ido creando si las hago descriptivas, ya las viejitas no me arriesgo porque peligra la vida del artisita!!

Y en lo ralacionado a la tabla mae_conse, es cierto que sobra la descripcion lo hago solo para mi uso

Gracias por todas las sugerencias, son muy valiosas para el aprendizaje diario.
Reply all
Reply to author
Forward
0 new messages