Insertar varios registros desde VFP a MySql en un solo intento

2,739 views
Skip to first unread message

BD Learner

unread,
Jul 3, 2013, 2:28:20 PM7/3/13
to sistemas-gestores...@googlegroups.com
Cómo se podría grabar un Asiento Contable completo con todas sus partidas desde un Cursor VFP a una tabla MySql ? ..

Num_Asiento Tipo_Asiento Cuenta, - fecha,      fuente, estado , debito,    credito
12                  E               110505  2013-01-01  CI            A            150.000       0.00
12                  E                510101  2013-01-01  CI           A             0.00        100.000
12                  E                610102  2013-01-01  CI           A             0.00        50.000

¿Cómo habría que armar el INSERT?..

Nota. La instruccion debe ir directo al motor, no a través de un cursor actualizable (SPT).

Gracias!

Carlos Miguel FARIAS

unread,
Jul 3, 2013, 7:05:37 PM7/3/13
to sistemas-gestores...@googlegroups.com
Con sql passthru.
Creas una string con el INSERT INTO básico, luego en un bucle, agregas una linea por cada fila del cursor, luego ejecutas la sentencia sqlexec con todo ese string
Saludos: Miguel, La Pampa (RA)



--
Has recibido este mensaje porque estás suscrito al grupo "Sistemas Gestores de Bases de Datos" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/sistemas-gestores-de-bases-de-datos.
 
 

Analyzer

unread,
Jul 3, 2013, 10:42:05 PM7/3/13
to sgbd
CMF,

Gracias! Si pensé en lo mas facil que era lo del bucle en base al numero de poliza e ir agregando registro tras registro, pero por un momento pensé que se podría hacer con algun truco en el insert y where..

Pero creo que la manera correcta es como lo indica.


Saludos!

Enrique Ramos

unread,
Sep 29, 2013, 5:20:20 PM9/29/13
to sistemas-gestores...@googlegroups.com
Te dejo un ejemplo de como puedes enviar varios registros en una sola instrucción:

Hernan Cano

unread,
Sep 29, 2013, 7:08:05 PM9/29/13
to sistemas-gestores...@googlegroups.com
Enrique y "aprendiz":
yo conocí esta sintaxis en el ejemplo GridLibre que el colega Malkasoft nos muestra en su web, el cual te muestro a continuación:

INSERT INTO `tbpedido` (`NUMPEDIDO`,`DESMARCA`,`ESTILOPROV`,`DESCOLORAC`) VALUES
 ('0000017064','ADICTION ','80206 ','PLATA S/D '),
 ('0000017064','ADICTION ','80206 ','PLATA S/D '),
 ('0000017319','ADICTION ','80206 ','PLATA S/D '),
 ('0000017922','ADICTION ','80206 ','PLATA S/D ') ;

Observa que los valores de cada registro están encerrados entre paréntesis, y al final está el clásico punto y coma.

Nota:
Quise crear la misma bdatos (con las mismas instrucciones que están el al archivo con extensión .sql) en SQLite, pero esta sintaxis no es válida en SQLite.

Rodrigo Bedoya Zuluaga

unread,
Sep 29, 2013, 9:14:50 PM9/29/13
to sistemas-gestores...@googlegroups.com
Hola yo lo hago mucho mas facil :
 
Asumamos que tiene un cursor con los datos a ingresar llamelo  temporal_pedidos
Entonces yo hago
 
=filtracursor("1=2',"tbpedido")
=preparacursor("tbpedido")
select tbpedido
append from dbf("temporal_pedidos")
IF enviarcursor("tbpedido")<0
   WAIT WINDOWS "FALLO INSERCION"
ENDIF
 
 
Que tiene casa function:
 
*!* **********************************************************************************
*!* Funcion de preparacion de las tablas de procesos para el TABLEUPDATE 
*!* **********************************************************************************
FUNCTION PREPARACURSOR
LPARAMETERS ralias,restru,rfisico
IF PCOUNT() < 1
 RETURN .F.
ENDIF
LOCAL old_select,restru,rfisico,rcamps1,rcamps2,rprim,a
old_select = ALIAS()
#INCLUDE FOXPRO.H
restru  = IIF(EMPTY(restru),loc_nomestruc(ralias),restru)
IF EMPTY(rfisico)
 IF USED(ralias)
  rfisico = loc_nomfisico(ralias)
 ELSE
  rfisico = name_tabla(restru)
 ENDIF
ENDIF
rcamps1 = mk_upd_list(restru,0)
rcamps2 = mk_upd_list(restru,1,rfisico)
rprim   = mk_key_list(restru)
a=CURSORSETPROP('TABLES',rfisico,ralias)
a=CURSORSETPROP('KEYFIELDLIST',rprim,ralias)
a=CURSORSETPROP('UpdateNameList',rcamps2,ralias)
a=CURSORSETPROP('UpdatableFieldList',rcamps1,ralias)
IF rnum_transact < 1
 a=SQLSETPROP(nro_conec,'Transactions',2)
ENDIF
a=CURSORSETPROP('Buffering',5,ralias)
a=CURSORSETPROP('SendUpdates',.T.,ralias)
IF !EMPTY(old_select)
 SELECT(old_select)
ENDIF
RETURN
ENDFUNC

*******************************************************************
FUNCTION ENVIARCURSOR
LPARAMETERS ralias,muest_error
IF PCOUNT() < 1
 RETURN .F.
ENDIF
LOCAL retor,old_select,rtransa
old_select = ALIAS()
DO verifica_datos WITH ralias
retor = .F.
IF rnum_transact = 0
 rtransa = 1 && TRANSACCION AUTOMATICA
ELSE
 rtransa = 2 && TRANSACCION MANUAL
ENDIF
*WAIT WINDOW "Voy a TABLEUPDATE(.T.,.T.,"+ralias+") ..."
IF NOT TABLEUPDATE(.T.,.T.,ralias)
 muest_error = .T.
 IF muest_error
  n = AERROR(mat_error)        && Datos del error más reciente
  IF (n > 0) AND (mat_error[1,5] != 2627)
   a_err = "muestra_error("+ALLTRIM(STR(n))+","+"@mat_error"+")"
   &a_err
  ENDIF
 ENDIF
 IF rnum_transact = 0
  IF ODBC_MOTOR = 'SQL'
   =SQLEXEC(nro_conec,'ROLLBACK TRANSACTION')
   =SQLSETPROP(nro_conec,'Transactions',rtransa)
  ELSE
   =SQLROLLBACK(nro_conec)
   =SQLSETPROP(nro_conec,'Transactions',rtransa)
  ENDIF
 ENDIF
  retor = .F.
ELSE
 IF rnum_transact = 0
  IF ODBC_MOTOR = 'SQL'
   =SQLEXEC(nro_conec,'COMMIT TRANSACTION')
   =SQLSETPROP(nro_conec,'Transactions',rtransa)
  ELSE
   =SQLCOMMIT(nro_conec)
   =SQLSETPROP(nro_conec,'Transactions',rtransa)
  ENDIF
 ENDIF
 retor = .T.
ENDIF
=CURSORSETPROP('SendUpdates',.F.,ralias) && Temporal de Grilla???
IF !EMPTY(old_select)
 SELECT(old_select)
ENDIF
RETURN retor
ENDFUNC
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


2013/9/29 Hernan Cano <jherna...@gmail.com>

Hernan Cano

unread,
Sep 29, 2013, 9:24:04 PM9/29/13
to sistemas-gestores...@googlegroups.com
Sorry, rodri, pero no me parece que 98 renglones/sentencias sean más fácil que 1 instrucción....

El domingo, 29 de septiembre de 2013 20:14:50 UTC-5, Rodrigo Bedoya Zuluaga escribió:
Hola yo lo hago mucho mas facil...

Enrique Ramos

unread,
Oct 3, 2013, 11:16:37 PM10/3/13
to sistemas-gestores...@googlegroups.com
Hernan, me puse a leer algo de SQLite al parecer es algo de las Transacciones siempre activadas que tiene, te recomiendan hacer lo siguiente:

Te pongo el código en VFP, creo que es lo que usas:
SELECT miTablaDatos
=SQLexec(lnHandle,"BEGIN IMMEDIATE TRANSACTION")
lcSql = "INSERT INTO tbpedido (NUMPEDIDO, DESMARCA, ESTILOPROV, DESCOLORAC) VALUES(?miTablaDatos.NUMPEDIDO, ?miTablaDatos.DESMARCA, ?miTablaDatos.ESTILOPROV, ?miTablaDatos.DESCOLORAC)
SCAN
x=SQLexec(lnHandle,lcsql)   
ENDSCAN
=SQLexec(lnHandle,"COMMIT TRANSACTION")

El miércoles, 3 de julio de 2013 13:28:20 UTC-5, BD Learner escribió:

Hernan Cano

unread,
Oct 4, 2013, 2:58:25 PM10/4/13
to sistemas-gestores...@googlegroups.com
Gracias, Enrique.
Esta respuesta va para el aprendiz de base de datos (BD Learner), pero colocaste mi nombre.
 
Enrique: el aprendiz utiliza MySL, no usa SQLte ---para esta pregunta--- (téngase en cuenta que SQLite no permite el uso de esta metodología; yo ya lo comprobé --enviar en una sola sentencia la inserción de varios registros--).
La solución debe mirarse según la sgte metodología (como lo expuse antes):
 
INSERT INTO `tbpedido` (`NUMPEDIDO`,`DESMARCA`,`ESTILOPROV`,`DESCOLORAC`) VALUES
('0000017064','ADICTION ','80206 ','PLATA S/D '),
('0000017064','ADICTION ','80206 ','PLATA S/D '),
('0000017319','ADICTION ','80206 ','PLATA S/D '),
('0000017922','ADICTION ','80206 ','PLATA S/D ') ;
 
Como lo propones son varias instruccones, pero él pregunta que quiere que sea una sola (si él ya sabe hacerlo como tú mencionas, debería usar esa metodología y no complicarse, pero cuando se está estudiando, se hacen unas preguntas!!!!!!).
 
Chao.
Reply all
Reply to author
Forward
0 new messages