En dias pasado se comentaba en los foros de noticias de Microsoft, si se podría utilizar la cláusula FROM MEMVAR dentro de sentencias enviadas via SQL Pass Through (SPT):
Select MiCursor SCATTER MEMVAR SQLExec(lnConnHandle,"INSERT INTO miTablaSQL FROM MEMVAR")
Esto no es posible, ya que nisiquiera el controlador ODBC de VFP da la posibilidad de hacerlo, ni hablar de cualquier otro cómo puede ser MS-SQL Server.
Claro está, la vistas remotas podría ser la solución, pero puede que el requisito para resolver cierto problemas (como el tener cientos de tablas, lo que nos tendría cientos de vistas creadas y quizás despues no se usaran) no nos permite hacerlo.
Por tal motivo propongo una idea para crear sentencias INSERT para ser enviadas via SPT. TextMerge puede ser una solución viable:
FUNCTION CrearInsert(tcCursor, tcTabla)
LOCAL lnFields,; && Numero de campos del cursor
laFields,; && Arreglo con la estructura del cursor
lcInsertQuery && Cadena que contendrá el INSERT
DIMENSION laFields[1]
lcInsertQuery=SPACE(0)
**** Hacemos algunas validaciones ****
**** Si no se incluye el nombre del cursor o de la tabla
**** Se utilizará el ALIAS() en ambos casos
tcCursor = IIF(TYPE('tcCursor')#'C' OR EMPTY(tcCursor),ALIAS(), tcCursor)
tcTabla = IIF(TYPE('tcTabla') #'C' OR EMPTY(tcTabla),tcCursor,tcTabla)
**** Obtenemos la información del cursor
lnFields = AFIELDS(laFields,tcCursor)
IF lnFields > 0
**** Creamos la instrucción INSERT(Campo,Campo2...CampoN) ****
SET TEXTMERGE ON
SET TEXTMERGE TO MEMVAR lcInsertQuery NOSHOW
\ INSERT INTO << tcTabla >>(
FOR I=1 TO lnFields
\ << laFields[i,1] >>,
ENDFOR
SET TEXTMERGE TO
lcInsertQuery=SUBSTR(lcInsertQuery,1,LEN(lcInsertQuery)-1) + ')'
**** Agregamos la cláusula VALUES(?Campo1, ?Campo2... ?CampoN) ****
SET TEXTMERGE TO MEMVAR lcInsertQuery NOSHOW ADDITIVE
\ VALUES (
FOR I=1 TO lnFields
\ ?<< tcCursor >>.<< laFields[i,1] >>,
ENDFOR
SET TEXTMERGE TO
SET TEXTMERGE OFF
lcInsertQuery=SUBSTR(lcInsertQuery,1,LEN(lcInsertQuery)-1)+ ')'
ENDIF
RETURN lcInsertQuery
ENDFUNC
Muy bien, ya tenemos la función ahora veremos un caso práctico en el cual utilizarlo.
Supongamos que tenemos un numero indeterminado de tablas VFP cuyos registros serán insertadas al servidor de base de datos via SPT. Donde la tabla tiene la siguiente estructura:
MiTabla (iID int, dFecha date, iClienteID int, iSeccionID int, yImporte Y)
USE miTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
La cadena lcInsert contendrá lo siguiente:
INSERT INTO Ventas( IID, DFECHA, ICLIENTEID, ISECCIONID, YIMPORTE) VALUES(?MiTabla.IID,?MiTabla.DFECHA,?MiTabla.ICLIENTEID,?MiTabla.ISECCION,?MiTabla.YIMPORTE)
Ahora podemos utilizar esta instrucción para mandarla via SPT:
USE MiTabla IN 0
lcInsert = CrearInsert("Mitabla","Ventas")
lcRegistros = trans( RECCOUNT("MiTabla"))
llError = .F.
IF SQLPrepare(lnConnHandle,lcInsert) > 0
SCAN FOR NOT llError
WAIT WINDOW "Insertando registro " + TRANS(recno())+ "/"+lcRegistros NOWAIT
llError = SQLExec(lnConnHandle) < 0
ENDSCAN
IF llError
Messagebox(laError[2],"Error al insertar")
ELSE
WAIT WINDOW "Proceso Finalizado"
ENDIF
ENDIF
Lo anterior es un ejemplo sencillo donde quizas pueda hacerse manualmente, pero imagínate si dicha tabla(s) tienen 50 campos, o incluso, se tienen 100 tablas?, aquí es donde este proceso de crear Insert vía TEXTMERGE ayudará en demasía. Espero que este tip les sea de utilidad.
Espartaco Palma Martínez
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.