INSERT INTO vfp VS INSERT INTO SQL

2,705 views
Skip to first unread message

smartito

unread,
Jun 27, 2012, 3:08:47 AM6/27/12
to publice...@googlegroups.com
Buenas Grupo!

Estoy intentando hacer una cosa que necesito que sea lo más fácil posible, a ver si me podeis echar una mano:

VFP 9 SP1
SQL Server 2005

El tema es diferenciar la Facturación Preliminar de la Facturación Definitiva de mi aplicación. La tabla de SQL que interviene es "AdPagos" y lo que hago es que si es facturación preliminar, me creo un cursor con la misma estructura que la tabla de SQL, lo llamo (tmpAdPagos) y voy llenandola con la facturación preliminar, el resultado lo muestro en un reporte, y la borro.
Cuando es Facturación Definitiva, la cosa cambia, voy haciendo el mismo proceso que en la facturación preliminar, pero a diferencia, no voy guardando las facturas en un cursor temporal (tmpAdPagos) sino que voy haciendo Inserts sobre la tabla SQL (AdPagos) el resultado lo muestro en un reporte y hago otras operaciones, que no interfieren en mi pregunta:

Independientemente de que ataque a la base de datos (facturacion definitiva) o sobre un cursor vfp (facturacion preliminar) tengo que hacer un INSERT INTO y lo monto de la siguiente manera:

TEXT TO strInsert TEXTMERGE NOSHOW PRETEXT 8
INSERT INTO TMPAdPagos ( campo1, campo2, campo3 )
VALUES
(
'<<tmpAdInquilinos.campo1>>',
<<tmpAdInquilinos.campo2>>,
'<<tmpAdInquilinos.campo3>>'
)
ENDTEXT
&strInsert

Con este código trabajo con el cursor temporal de VFP y me va creando las líneas que necesito, si por el contrario fuera la facturacion definitiva, lo que haría sería:

TEXT TO strInsert TEXTMERGE NOSHOW PRETEXT 8
INSERT INTO AdPagos ( campo1, campo2, campo3 )
VALUES
(
'<<tmpAdInquilinos.campo1>>',
<<tmpAdInquilinos.campo2>>,
'<<DTOC(tmpAdInquilinos.campo3)>>'
)
ENDTEXT

SQLEXEC(pMiCon, strInsert, 'AdPagos')

Como veis lo único que cambia de la cadena "strInsert" es el prefijo de la tabla (AdPagos) por (TMPAdPagos) y que el tercer campo (en el ejemplo, en mi caso real son mas de 15 campos que cambian) uno es '<<tmpAdInquilinos.campo3>>' y el otro '<<DTOC(tmpAdInquilinos.campo3)>>'

Cómo puedo hacer para no tener dos textto strInsert, sino que dependiendo de que sea facturacion preliminar o definitiva, me monte la cadena válida para SQL o para VFP.

Espero haberme explicado bien, si necesitais alguna cosa mas, me lo decis.

Muchas gracias!


MarceloBuenosAires

unread,
Jun 27, 2012, 5:26:35 AM6/27/12
to publice...@googlegroups.com
Hola

No se puede interponer una bifurcacion ("IF")
antes de la cadena correspondiente ?

Otro tema, no es mejor ejecutar una sola operacion...
diferenciando una de otra simplemente con un campo
(llamado p.e. "Definitiva") en la tabla ?

Si el campo es .T., es Facturacion Definitiva, sino es Preliminar ?

Saludos
MarceloBuenosAires
_______________________

smartito

unread,
Jun 27, 2012, 5:52:53 AM6/27/12
to publice...@googlegroups.com
Hola!

Gracias por responder,

Con respecto a la segunda pregunta, no, no quiero tener en la tabla de SQL la facturación preliminar puesto que es una cosa que no quiero guardar en la base de datos.

Con respecto a la primera pregunta, cómo hago para poner una bifurcación ("IF") ¿? Si me lo explicas con un ejemplo, sobre los datos que he puesto en el post original, gracias!

Saludos!

Alan Cybar

unread,
Jun 27, 2012, 8:30:49 AM6/27/12
to publice...@googlegroups.com
Buenos dias,


Puedes probar esto si te funciona:


TEXT TO strInsert TEXTMERGE NOSHOW PRETEXT 8
INSERT INTO <<IIF(condicion = .t., AdPagos, TMPAdPagos>> ( campo1, campo2, campo3 )

VALUES
(
'<<tmpAdInquilinos.campo1>>',
<<tmpAdInquilinos.campo2>>,
'<<tmpAdInquilinos.campo3>>'
)
ENDTEXT
&strInsert


Saludos,

Alan

Pablo Daniel Lissa

unread,
Jun 27, 2012, 8:35:21 AM6/27/12
to Comunidad de Visual Foxpro en Español
Hola:

Me parece que deberías independizarte del formato de los datos antes
de utilizar el comando TEXT. Por ejemplo:

********************************************************************
LOCAL cTabla as String, cCampo3 as String, lPreliminar as Logical
lPreliminar = .T. && Por ejemplo.
cTabla = IIF( lPreliminar, "TMP", "" ) + "AdPagos"
cCampo3 = IIF( lPreliminar, tmpAdInquilinos.campo3,
DTOC(tmpAdInquilinos.campo3) )

* Otras sentencias ...

TEXT TO strInsert NOSHOW TEXTMERGE PRETEXT 8
INSERT INTO <<cTabla>>( campo1, campo2, campo3 )
VALUES ('<<tmpAdInquilinos.campo1>>', <<tmpAdInquilinos.campo2>>,
'<<cCampo3>>')
ENDTEXT
********************************************************************

Respecto a la bifurcación IIF, podrías ponerla completa dentro de TEXT
- ENDTEXT, encerrada entre los delimitadores << >>. Por ejemplo:
'<<IIF( lPreliminar, tmpAdInquilinos.campo3,
DTOC(tmpAdInquilinos.campo3) )>>'

Espero que te sirva. Saludos.
-------------------------------------------------------------------------

smartito

unread,
Jun 27, 2012, 9:57:29 AM6/27/12
to publice...@googlegroups.com
Hola Pablo,

Es así como lo he hecho y me funciona, muchas gracias a todos por vuestra ayuda.

Saludos!

Daniel Sánchez

unread,
Jun 27, 2012, 10:53:50 AM6/27/12
to publice...@googlegroups.com
Yo creo que para que hacer una factura temporal, en todo caso seria un pedido o nota de venta o orden de atención o cualquier otro nombre que desees darle, mas no una factura, porque se factura o no se factura, quien desearía llenar algo que no va ha servir, o me parece estas usando la lógica difusa que tanto comenta Edgar y Carlos M.

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

smartito

unread,
Jun 27, 2012, 11:30:19 AM6/27/12
to publice...@googlegroups.com
Hola Daniel,

En casi todos los programas "Españoles" de facturación que conozco, todos dan la posibilidad al usuario de hacer una facturacion preliminar (de lo que va a realmente facturar) y una facturación definitiva. Que no se debería de llamar facturacion preliminar¿? pues nose, lo mismo estás en lo cierto, deberíamos llamarla, ComovaaquedartufacturacioncuandopulseselbotonFACTURAR ... :P

Si tienes alguna otra idea, te agradeceré que la compartas con nosotros. 

Saludos!

Daniel Sánchez

unread,
Jun 27, 2012, 11:39:41 AM6/27/12
to publice...@googlegroups.com
Excelente, que bueno que nos entendimos....

smartito

unread,
Jun 27, 2012, 11:56:52 AM6/27/12
to publice...@googlegroups.com
Te he pedido que por favor me orientes sobre como debería hacerlo, pero una cosa te digo, me pones "  quien desearía llenar algo que no va ha servir, o me parece estas usando la lógica difusa que tanto comenta Edgar y Carlos M. " en todo momento he dicho que la "facturacion preliminar" va en un cursor TEMPORAL que se borra y que no quiero guardarlo sobre la base de datos, que ahí si va la facturacion DEFINITIVA... no se si es que no me he explicado correctamente....

Noto por tus puntos suspensivos al final de tu frase, que o no me he enterado de lo que me has querido decir, o que sigo aplicando según tú, la lógica difusa de los compañeros Edgar y Carlos M. Puedes ser más conciso? 

Saludos!!

Daniel Sánchez

unread,
Jun 27, 2012, 1:54:27 PM6/27/12
to publice...@googlegroups.com
Lo que te podría recomendar es lo siguiente, siempre trabajarlo de modo preliminar y cuando ya esta seguro que si va pues un botón como dices "a Facturar" donde se encargue de enviarlo al servidor, caso contrario queda ahí nada más.

smartito

unread,
Jun 28, 2012, 2:30:18 AM6/28/12
to publice...@googlegroups.com
Y es así justo como lo estoy haciendo,

El problema estaba que necesitaba una misma función para trabajar con un cursor que con una tabla de SQL, de ahí la pregunta.

De todos modos ya está resuelto el tema, y el modo de trabajar que planteas es el que estaba haciendo desde un principio. 

Saludos!
Reply all
Reply to author
Forward
0 new messages