sql insert varios registros

237 views
Skip to first unread message

JCReyna

unread,
Mar 4, 2025, 12:45:07 PM3/4/25
to Comunidad de Visual Foxpro en Español
Buen dia

Estoy usando VFP9 y quiero insertar en tablas dbf varios registros a la vez con la siguiente instruccion  pero me marca el  error "command contains unrecognized phrase/keyword"


           TEXT TO WSQLCMD NOSHOW PRETEXT 15
              INSERT INTO DBFTABLA
                 (CAMPO1, CAMPO2, CAMPO3)
              VALUES
                  (?VALOR1, ?VALOR2, ?VALOR3),
                  (?VALOR4, ?VALOR5, ?VALOR6)
           ENDTEXT

Agradezco de antemano cualquier ayuda que me puedan dar.

Saludos

Gerardo Cagnola

unread,
Mar 4, 2025, 1:04:48 PM3/4/25
to publice...@googlegroups.com
a que base???

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/2e90c53b-321c-4efe-9077-26f103a5cae0n%40googlegroups.com.

José Antonio Peña Martínez

unread,
Mar 4, 2025, 1:58:58 PM3/4/25
to publice...@googlegroups.com

Creo que Valor 4, 5 y 6 van en otro insert


Dsan

unread,
Mar 4, 2025, 2:47:41 PM3/4/25
to publice...@googlegroups.com
Hola si es una tabla dbf como indicas, esto no es necesario ?.

Si la información esta en un motor y ya la tiene usted en un cursor basta hacer 
insert into tabla1  select ... from tabla2
o select tabla1
append from dbf("tabla2")

Pero sería bueno que aclarara,  ya que si es registro a registro text endtext lo veo innecesario mas si es dbf como dinca: quiero insertar en tablas dbf varios registros a la vez 

Saludos

DSan




Gerardo Cagnola

unread,
Mar 4, 2025, 4:37:40 PM3/4/25
to publice...@googlegroups.com

JCReyna

unread,
Mar 4, 2025, 5:35:27 PM3/4/25
to Comunidad de Visual Foxpro en Español
tengo un formato  para la captura de pagos de facturas, el cual tiene un "grid" con  las siguientes columnas: factura1 pago1 factura2 pago2.

Es decir que en cada renglón se pueden capturar el pago de dos facturas.

Cuantos renglones con factura1 y factua2 se capturen es indefinido pero por cada renglón debe grabar dos veces en la tabla de pagos de facturas, grabar el pago1 de la factura1 y grabar el pago2 de la factura2. La tabla es un DBF nativo.

En este momento hago dos insert por cada renglon, me a tocado ver capturas de pagos de mas de 100 renglones.

En este momento lo hago con append pero estoy cambiando  la rutina de grabación a insert pensando en un futuro migrar a un motor de bases de datos.

Checando en internet vi que se pueden insertar varios renglones en una tabla con una sola instrucción "insert" pero no se si esto solo funciona para motores de bases de datos o si funciona también para tablas dbf nativas de vfp.

RS “Ricardo”

unread,
Mar 4, 2025, 7:41:32 PM3/4/25
to Comunidad de Visual Foxpro en Español
Hola JcReyna  podrias mostrar la estructura d ela dbf que quieres grabar

Pero a priori yo te recomiendo que asocies al grid un cursor el cual posteriormente puedas recorrer con un scan
y haces algo como esto
select cursor_asociado_al_grid
scan 
  if Condiciones de validacion 
       insert into dbftabla (campo1, campo2m campo3) values ( cursor_asociado_al_grid.campo1,  cursor_asociado_al_grid.campo2, cursor_asociado_al_grid.campo3)
endif
select  cursor_asociado_al_grid
endscan

JCReyna

unread,
Mar 5, 2025, 12:04:58 PM3/5/25
to Comunidad de Visual Foxpro en Español
Así es como lo tengo ahora, un cursor asociado al grid.

Recorro el cursor con "do while", tomo del cursor los datos para asignarlos a las variables y con estas  formo la instrucción "insert" para cada una de las facturas a pagar, 2 "insert" por renglón.

Viendo de nuevo la ayuda de vfp para "insert sql" no dice que se pueda insertar mas de un renglon.

Gracias a todos por sus comentarios.


Zarlu

unread,
Mar 5, 2025, 12:06:09 PM3/5/25
to Comunidad de Visual Foxpro en Español
Buenos días Carlos!

Te dejo un ejemplo, quizá a esto te refieres con INSERT con varios registros

CREATE CURSOR fuente(factura1 i,pago1 i,factura2 i,pago2 i)
FOR b=1 TO 6
INSERT INTO fuente VALUES(b,b*1000,b+1,(b+1)*1000)
b=b+1
ENDFOR
GO Top
BROWSE
CREATE CURSOR destino (numpago i, importe i)
INSERT INTO destino(numpago,importe) Select factura1, pago1 FROM fuente
INSERT INTO destino(numpago,importe) Select factura2, pago2 FROM fuente
SELECT * FROM destino ORDER BY numpago

Suerte
zarlu
Chetumal, Quintana Roo, México

Zarlu

unread,
Mar 5, 2025, 12:27:00 PM3/5/25
to Comunidad de Visual Foxpro en Español
Qué tal Carlos!

Optimizando dos líneas de mi sugerencia anterior:

CREATE CURSOR fuente(factura1 i,pago1 i,factura2 i,pago2 i)
FOR b=1 TO 6
INSERT INTO fuente VALUES(b,b*1000,b+1,(b+1)*1000)
b=b+1
ENDFOR
GO Top
BROWSE
CREATE CURSOR destino (numpago i, importe i)
INSERT INTO destino(numpago,importe) Select factura1, pago1 FROM fuente UNION Select factura2, pago2 FROM fuente
Browse

Suerte
zarlu
Chetumal, Quintana Roo, México

Mik

unread,
Mar 5, 2025, 2:40:41 PM3/5/25
to Comunidad de Visual Foxpro en Español
Algo así podria servir:

select capturaFacturas
scan
   scatter memvar
   if m.pago1 > 0
      insert into pagoFacturas (numeroFactura, Importe) ;
values (m.factura1, m.Pago1)
   endif
   if m.pago2 > 0
      insert into pagoFacturas (numeroFactura, Importe) ;
values (m.factura2, m.Pago2)
   endif
   select capturaFacturas
endscan 


Saludos!

JCReyna

unread,
Mar 6, 2025, 11:58:54 AM3/6/25
to Comunidad de Visual Foxpro en Español
Gracias por tu comentario

Eso es lo que estoy haciendo en este momento, dos insert.

Pero es lo que quiero cambiar, poder hacerlo en un solo insert como se indica en la instrucción  al inicio de esta conversación.

Saludos

HernanCano

unread,
Mar 6, 2025, 12:33:38 PM3/6/25
to Comunidad de Visual Foxpro en Español
Disculpa.... entonces ¿tampoco te sirve la forma como te inicó Zarlu?

borrable1.png

Gerardo Cagnola

unread,
Mar 6, 2025, 12:40:59 PM3/6/25
to publice...@googlegroups.com
ese insert sirve, por ejemplo, para mysql pero no para postgresl ni, creo, sql server
o sea, no te sirve como algo genérico


José Antonio Peña Martínez

unread,
Mar 6, 2025, 1:02:33 PM3/6/25
to publice...@googlegroups.com
Aunque SQL directamente si tiene forma de hacer lo que intentas, desde VFP no es compatible con la instrucción de SQL de insertar varios registros en una sentencia, para esto, tendrías que agregar los registros importandoles con append from ya sea desde un cursor, tabla, archivo..

fuente:


Saludos! 



--
Desarrollo de Sistemas TecnoPro
José Antonio Peña

Saludos!

Miguel Antúnez

unread,
Mar 6, 2025, 1:26:50 PM3/6/25
to publice...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages