Ayuda con un Trigger

UnySoft espero encontrar respuesta al siguiente problema que se me presenta.
Tengo una aplicación que hice en visual foxpro 9 para leer información de unas tablas y pasarlas a un archivo texto, eso ya lo hice y me funciona bien, pero mi jefe me dice que lo maneje con un trigger para que al momento de que se capture la información inmediatamente se active esta aplicación y genere el archivo, MÁS NO SE COMO PUEDO HACERLO, ya que no es la misma aplicación, (osea no tengo el programa fuente, lo que hice fue una interface) por lo cual no se como hacerle para que cuando terminen de capturar la información, me ejecute esta interfase.
No se como hacer un trigger, como crearlo, cuando crearlo, donde ponerlo, como ejecutarlo, intente inventar uno:
CREATE TRIGGER ON MGW10008 FOR INSERT AS Ciddocum = 4
DO FORM "c:\respaldo 15 sep maquina de carlos\facturas electronicas\factfox\frmfactura.scx"
Y me dice que esta característica no esta permitida para una tabla que no es .DBC (Claro es una tabla con extensión DBF, a un no tengo ningún ejemplo de ello incluso me sorprende que en la red no encuentre ningún ejemplo de ello. No se ni siquiera si pueda ejecutar un prg si cumple la condición, LA VERDAD DESCONOZCO POR COMPLETO SU FUNCIONAMIENTO, ples ayúdenme.
Ante todo te doy las gracias y espero pronto tu respuesta porque ya no se que hacer.
3

3 respuestas

Respuesta
1
Ok, espero poder solucionarte el problema.
Utilice CREATE TRIGGER para interceptar eventos que hacen que se eliminen, agreguen o cambien los registros de una tabla. Los desencadenadores Delete, Insert o Update sólo pueden crearse para una tabla que se ha agregado a una base de datos.
Creates a Delete, Insert, or Update trigger for a table.
CREATE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE AS lExpression
Parameters
TableName
Specifies the table in the current database for which a trigger is created.
FOR DELETE | INSERT | UPDATE
Specifies the type of trigger Visual FoxPro creates.
If a trigger of the type you specify already exists and SET SAFETY is ON, Visual FoxPro asks you if you would like to overwrite the existing trigger. If SET SAFETY is OFF, the existing trigger is automatically overwritten.
AS lExpression
Pero bueno espero que te sirva los link que te deje, sin embargo recuerda que un tigger, se ejecuta en la tabla, pero este tigger indica una transacción o un evento que sucederá en la tabal, sin embargo sino programas en modo sql es decir con operaciones insert, delete, update no te servirán ya que estas solo soportan sql y recuerda que te puede dar unos problemas es decir se convertirá una tabla un poco más lenta .
http://msdn.microsoft.com/en-us/library/xtydh4db%28VS.80%29.aspx
http://msdn.microsoft.com/es-es/library/cc467104%28v=VS.71%29.aspx
Saludos si tienes más duda no dudes en preguntar
Gracias por el punto, pero me quedo una duda, espero que no te desesperes, con tu ayuda hice lo siguiente, haber si te entendi
SET SAFETY OFF
CREATE TRIGGER ON Carmen FOR INSERT AS MGW10008.Ciddocum02 = 4
 BEGIN TRANSACTION
     DO Agrega_Factura
END TRANSACTION
PROCEDURE Agrega_Factura
     DO c:\icon\archivos\proc_factura.prg
ENDPROC
1.- La aplicación que maneja la información esta en DBF/Tablas separadas (osea que no están juntas en una misma base de datos (*.DBC) ), al momento de correr la aplicación me mando un mensaje de que no me deja trabajar con una tabla sino con una DBC, así que las metí en una tabla llamada CARMEN. ¿Por qué hace esto?
2.- Al correr nuevamente la aplicación me pide el nombre de la tabla con la que debe de trabajar o la que va abrir (Que se supone que es [Mgw10008.dbf]) y luego ya funciona, pero yo tengo fijo un numero de folio. Por que me pide la tabla, como debo de ponerlo para que no me vuelva a pedir el nombre de la tabla
3.- Necesito, como estoy mandando llamar a un prg, y si funciona, ¿necesito mandarle como parámetro un valor ese como le hago?
Gracias por tu paciencia.
Es por lo que yo te decia, que necesitas trabajarlo con una tabla y como ya sabes que no puedes manipular los datos asi por que asi, entonces se encarga de no arruinar una tabla ya que esta se puede corromper como normalmente pasa en fox, y la proxima ves te sale asi por que no tienes bien definidas tus rutas por ejemplo
set default to "c:\proyecto\data1"
Entonces esta en el directorio data1 y ahí busca todo entonces lo que tienes que hacer es direccionar también hacia la otra ruta cuando la necesites y cuando la dejes de usar, rediccionar a tu ruta actual .
Pero bueno para solicitar un parámetro a un prg lo que necesitas hacer es una función o un procedimiento esto se hace así de esta forma
Function ServerTime
    Parameters tcServerName
aqui puedes hacer lo que quieras y la variable lcServerName indica el valor que te mandaron como parametro
end func
Saludos espero que te sirve y no te preocupes pregunta si tienes dudas
Respuesta
1
Ante todo te sugiero MUCHA CALMA.
He leívo varias veces tu pregunta tratando de captar la esencia de tu problema y creo que hay una serie de malas interpretaciones:
1) La palabra Trigger significa literalmente "gatillo" o para nuestro caso de programadores "desencadenante". En Visual FoxPro la expresión TRIGGER se refiere a DESENCADENANTES para eventos Delete, Insert o Update para una tabla de una base de datos. Es decir que se refiere a desencadenantes para cuando agregas, actualizas o eliminas un registro de una tabla que está involucrada en relaciones con otras tablas de una base de datos. Esto no tiene nada que ver con lo que estás intentando hacer. Por otra parte el error que recibes se debe a que los "procedimientos almacenados" creados por los comandos Trigger se almacenan en la Base de Datos "DBC" y no en una tabla "DBF".
2) Yo interpreto que lo que tu jefe quiso decirte fue que hagas que la aplicación de destino se active automáticamente, y utilizó la palabra trigger en su sentido más amplio y absolutamente fuera del contexto de su significado en visual foxpro.
3) Dependiendo de la aplicación que desees activar existen varios métodos para hacerlo. Te sugiero que leas la ayuda sobre Servidores de Automatización OLE que viene con el Visual FoxPro para que te orientes un poco sobre el tema.
Espero haber sido de ayuda. Si tienes alguna otra duda no dudes en consultar.
Respuesta
1
Mi nombre es Hector, bueno es cierto no es muy difundido el uso de triggers en vfp e incluso lo que medio he visto no tiene el funcionamiento de un verdadero trigger igual que en otros manejadores de bases de datos, bueno pero creo que lo suyo pasa primero porque no tiene una base de datos sino que esta trabajando con tablas libres, primero debería revisar ese tema antes de poder continuar con lo del trigger
Envío código que hice probando el trigger, haber en que estoy mal, ¿ya qué me manda error en un campo que ni manejo?
Set Delete on
SET DATE TO british
SET CENTURY on
SET SAFETY OFF
SET TALK OFF
SET score off
SET STATUS OFF
CLEAR EVENTS
CLOSE DATABASES
SET SAFETY OFF
&&----- Inicializacion de Variables de memoria
DECLARE domicilioCliente [10]
DECLARE cliente [11]
DECLARE domicilioTienda [10]
DECLARE tienda[4]
DECLARE recibo[7]
DECLARE factura[17]
DECLARE conceptos[10,20]
STORE SPACE(150) TO nomarch, masterfile, txttexto, nomfile, cnControladorArch
STORE SPACE(250) TO cadena, cadena1, cadena2, cadena3
STORE 0 TO Id_Empresa, Id_Folio, i , j, Id_Documento, cicloconceptos, Id_Clave, Unidad, nTamaño
STORE SPACE(15) TO Codigo_Cliente
STORE 0 TO Id_Cliente, FacTotal, DetTotal, Documento1
PUBLIC FacAux as Double
CREATE TRIGGER ON Carmen FOR INSERT AS MGW10008.Ciddocum02 = 4
BEGIN TRANSACTION
FacAux = Cfolio
DO Agrega_Factura
END TRANSACTION
PROCEDURE Agrega_Factura
SET DEFAULT TO c:\icon\archivos
SELECT * FROM MGW10000 INTO CURSOR temp6
IF Csegcont01 <> "AXXRWE0BW45"
MESSAGEBOX("Lo sentimos pero no cuenta con autorizacion para realizar este proceso" + CHR(13) + ;
+ CHR(13)+ "FAVOR DE PONERSE EN CONTACTO CON SU DISTRIBUIDOR",0+16,"AVISO DEL SISTEMA")
RETURN
ELSE
&& +++++++ CREACION DE ARCHIVO ++++++++
SET DEFAULT TO "C:\Respaldo 15 Sep Maquina de Carlos\Facturas Electronicas\FactFox\Texto\"
masterfile ="Factura.txt"
arch=fcreate(masterfile,0)
NomFile=FOPEN(masterfile,2)
&& +++++++ DIRECCIONANDO DATOS ++++++++
SET DEFAULT TO c:\icon\archivos
&& +++++++ OBTENCION DE DATOS DE FACTURA ++++++++
*CREATE TRIGGER ON MGW10008 FOR INSERT AS maxordamt <= 50
Id_Folio = FacAux
SELECT * FROM MGW10008 WHERE cfolio = Id_Folio INTO CURSOR temp
Documento1= Ciddocum01
FacTotal = Ctotal
SELECT * FROM MGW10010 WHERE ciddocum01 = Documento1 INTO CURSOR temp
DetTotal=0
DO WHILE NOT EOF()
DetTotal = DetTotal + Ctotal
SKIP
ENDDO
IF FacTotal = DetTotal
SELECT * FROM MGW10008 WHERE cfolio = Id_Folio INTO CURSOR temp
DO WHILE NOT EOF()
Id_Documento = ciddocum01
Id_cliente = Cidclien01
factura(1) = "Sin Descuento"
factura(2) = "Sin Cargo"
factura(3) = "0"
factura(4) = "0"
factura(5) = Cseriedo01
factura(6) = Creferen01
factura(7) = "Efectivo"
factura(8) = "Una sola exhibición"
factura(9) = "BASIC_NET"
factura(10) = "DATE_OF_INVOICE"
factura(11) = "1"
factura(12) = ""
factura(13) = STR(Cfolio,10)
factura(14) = STR(Cimpuesto1,10)
factura(15) = "0"
factura(16) = "false"
factura(17) = "0"
SKIP
ENDDO
cadena = "FACTURA" + "|" + ALLTRIM(factura(1)) + "|" + ALLTRIM(factura(2)) + "|" + ALLTRIM(factura(3)) + "|" + ALLTRIM(factura(4)) + "|" + ALLTRIM(factura(5)) + "|" + ALLTRIM(factura(6)) + "|" + ALLTRIM(factura(7)) ;
+ "|" + ALLTRIM(factura(8)) + "|" + ALLTRIM(factura(9)) + "|" + ALLTRIM(factura(10)) + "|" + ALLTRIM(factura(11)) + "|" + ALLTRIM(factura(12)) + "|" + ALLTRIM(factura(13)) + "|" + ALLTRIM(factura(14)) ;
+ "|" + ALLTRIM(factura(15)) + "|" + ALLTRIM(factura(16)) + "|" + ALLTRIM(factura(17)) + "|"
fputs(arch,cadena)
&& +++++++ DOMICILIO DEL CLIENTE ++++++++
SELECT * FROM MGW10011 WHERE cidcatal01 = id_cliente INTO CURSOR temp
DO WHILE NOT EOF()
domicilioCliente(1) = Cpais
domicilioCliente(2) = Cestado
IF LEN(Cciudad) > 0 then
domicilioCliente(3) = Cciudad
ELSE
domicilioCliente(3) = Cmunicipio
ENDIF
domicilioCliente(4) = Cnombrec01
domicilioCliente(5) = Cnumeroi01
domicilioCliente(6) = Cnumeroe01
domicilioCliente(7) = Ccolonia
domicilioCliente(8) = Cmunicipio
domicilioCliente(9) = ""
domicilioCliente(10) = Ccodigop01
SKIP
ENDDO
cadena = "DOMCTE" + "|" + ALLTRIM(domicilioCliente(1)) + "|" + ALLTRIM(domicilioCliente(2)) + "|" + allTRIM(domicilioCliente(3)) + "|" + allTRIM(domicilioCliente(4)) + "|" + allTRIM(domicilioCliente(5)) ;
+ "|" + ALLTRIM(domicilioCliente(6)) + "|" + ALLTRIM(domicilioCliente(7)) + "|" + ALLTRIM(domicilioCliente(8)) + "|" + ALLTRIM(domicilioCliente(9)) + "|" + ALLTRIM(domicilioCliente(10)) + "|"
fputs(arch,cadena)
&& +++++++ INFORMACION DEL CLIENTE ++++++++
SELECT * FROM MGW10002 WHERE ALLTRIM(ccodigoc01) = ALLTRIM(codigo_cliente) INTO CURSOR temp
DO WHILE NOT EOF()
cliente(1) = ""
cliente(2) = Ccodigoc01
cliente(3) = Crazonso01
cliente(4) = "0000000000000"
cliente(5) = "0"
IF Cestatus = 0
cliente(6) = "INACTIVO"
ELSE
cliente(6) = "ACTIVO"
ENDIF
cliente(7) = "Crfc01"
cliente(8) = "false"
cliente(9) = "false"
cliente(10) = STR(Cimpuesto1,8,2)
cliente(11) = str(Cretenci01,8,2)
SKIP
ENDDO
cadena = "CLIENTE" + "|" + ALLTRIM(cliente(1)) + "|" + ALLTRIM(cliente(2)) + "|" + ALLTRIM(cliente(3)) + "|" + ALLTRIM(cliente(4)) + "|" + ALLTRIM(cliente(5)) + "|" + ALLTRIM(cliente(6)) ;
+ "|" + ALLTRIM(cliente(7)) + "|" + ALLTRIM(cliente(8)) + "|" + ALLTRIM(cliente(9)) + "|" + ALLTRIM(cliente(10)) + "|" + ALLTRIM(cliente(11)) + "|"
fputs(arch,cadena)
&& +++++++ DOMICILIO DE LA TIENDA ++++++++
SELECT * FROM MGW10011 WHERE cidcatal01 = id_cliente INTO CURSOR temp
DO WHILE NOT EOF()
domicilioTienda(1) = Cpais
domicilioTienda(2) = Cestado
IF LEN(Cciudad) > 0 then
domicilioTienda(3) = Cciudad
ELSE
domicilioTienda(3) = Cmunicipio
ENDIF
domicilioTienda(4) = Cnombrec01
domicilioTienda(5) = Cnumeroi01
domicilioTienda(6) = Cnumeroe01
domicilioTienda(7) = Ccolonia
domicilioTienda(8) = Cmunicipio
domicilioTienda(9) = ""
domicilioTienda(10) = Ccodigop01
SKIP
ENDDO
cadena = "DOMTIENDA" + "|" + ALLTRIM(domicilioTienda(1)) + "|" + ALLTRIM(domicilioTienda(2)) + "|" + ALLTRIM(domicilioTienda(3)) + "|" + ALLTRIM(domicilioTienda(4)) + "|" + ALLTRIM(domicilioTienda(5)) ;
+ "|" + ALLTRIM(domicilioTienda(6)) + "|" + ALLTRIM(domicilioTienda(7)) + "|" + ALLTRIM(domicilioTienda(8)) + "|" + ALLTRIM(domicilioTienda(9)) + "|" + ALLTRIM(domicilioTienda(10)) + "|"
fputs(arch,cadena)
&& +++++++ DATOS DE LA TIENDA ++++++++
SELECT * FROM MGW10011 WHERE cidcatal01 = id_cliente INTO CURSOR temp
DO WHILE NOT EOF()
tienda(1) = STR(Ciddirec01,15)
SKIP
ENDDO
SELECT * FROM MGW10000 INTO CURSOR temp6
DO WHILE NOT EOF()
tienda(2) = Cnombree01
tienda(3) = Cnombree01
tienda(4) = "0000000000000"
SKIP
ENDDO
cadena = "TIENDA" + "|" + ALLTRIM(tienda(1)) + "|" + ALLTRIM(tienda(2)) + "|" + ALLTRIM(tienda(3)) + "|" + ALLTRIM(tienda(4)) + "|"
fputs(arch,cadena)
&& +++++++ DATOS DEL RECIBO ++++++++
SELECT * FROM MGW10008 WHERE cfolio = id_folio INTO CURSOR temp
DO WHILE NOT EOF()
recibo(1) = "PROGRAMADA"
recibo(2) = STR(Cfolio,10)
recibo(3) = Creferen01
recibo(4) = ""
recibo(5) = ""
recibo(6) = DTOC(Cfecha)
recibo(7) = DTOC(Cfechaen01)
SKIP
ENDDO
cadena = "RECIBO" + "|" + ALLTRIM(recibo(1)) + "|" + ALLTRIM(recibo(2)) + "|" + ALLTRIM(recibo(3)) + "|" + ALLTRIM(recibo(4)) + "|" + ALLTRIM(recibo(5)) + "|" + ALLTRIM(recibo(6)) + "|" + ALLTRIM(recibo(7)) + "|"
fputs(arch,cadena)
&& +++++++ DETALLE DE LA FACTURA ++++++++
cicloconceptos = 0
SELECT * FROM MGW10010 WHERE ciddocum01 = Id_Documento INTO CURSOR temp
DO WHILE NOT EOF()
cicloconceptos = cicloconceptos + 1
conceptos(cicloconceptos, 1) = "Herramientas"
conceptos(cicloconceptos, 2) = "Herramientas"
Id_Clave = Cidprodu01
SELECT * FROM MGW10005 WHERE cidprodu01 = ID_Clave INTO CURSOR temp1
DO WHILE NOT EOF()
unidad = CidUnida01
SELECT * FROM MGW10026 WHERE cidunidad = unidad INTO CURSOR temp2
DO WHILE NOT EOF()
conceptos(cicloconceptos, 3) = Cnombreu01
conceptos(cicloconceptos, 4) = Cabrevia01
SKIP
ENDDO
SELECT temp1
IF cstatusp01 = 0 then
conceptos(cicloconceptos, 9) = "BAJA"
ELSE
conceptos(cicloconceptos, 9) = "ACTIVO"
ENDIF
conceptos(cicloconceptos, 10) = Ccodigop01
conceptos(cicloconceptos, 11) = Cnombrep01
IF cesexento = 0
conceptos(cicloconceptos, 13) = "NO EXENTO"
ELSE
conceptos(cicloconceptos, 13) = "EXENTO"
ENDIF
SKIP
ENDDO
SELECT temp
conceptos(cicloconceptos, 5) = STR(Cporcent01,18,3)
conceptos(cicloconceptos, 6) = STR(Cporcent02,18,3)
conceptos(cicloconceptos, 7) = STR(Cporcent06,18,3)
conceptos(cicloconceptos, 8) = ""
conceptos(cicloconceptos, 12) = "0000000000000"
conceptos(cicloconceptos, 14) = STR(Cprecio,18,4)
conceptos(cicloconceptos, 15) = STR(Cunidades,18,2)
conceptos(cicloconceptos, 16) = "1"
conceptos(cicloconceptos, 17) = ""
conceptos(cicloconceptos, 18) = ""
conceptos(cicloconceptos, 19) = "0"
conceptos(cicloconceptos, 20) = "0"
cadena = "CONCEPTOS" + "|" + ALLTRIM(conceptos(cicloconceptos, 1)) + "|" + ALLTRIM(conceptos(cicloconceptos, 2)) + "|" + allTRIM(conceptos(cicloconceptos, 3)) + "|" + allTRIM(conceptos(cicloconceptos, 4)) + "|" + allTRIM(conceptos(cicloconceptos, 5)) ;
+ "|" + ALLTRIM(conceptos(cicloconceptos, 6)) + "|" + ALLTRIM(conceptos(cicloconceptos, 7)) + "|" + ALLTRIM(conceptos(cicloconceptos, 8)) + "|" + ALLTRIM(conceptos(cicloconceptos, 9)) + "|" + ALLTRIM(conceptos(cicloconceptos, 10)) ;
+ "|" + ALLTRIM(conceptos(cicloconceptos, 11)) + "|" + ALLTRIM(conceptos(cicloconceptos, 12)) + "|" + ALLTRIM(conceptos(cicloconceptos, 13)) + "|" + ALLTRIM(conceptos(cicloconceptos, 14)) + "|" + ALLTRIM(conceptos(cicloconceptos, 15)) ;
+ "|" + ALLTRIM(conceptos(cicloconceptos, 16)) + "|" + ALLTRIM(conceptos(cicloconceptos, 17)) + "|" + ALLTRIM(conceptos(cicloconceptos, 18)) + "|" + ALLTRIM(conceptos(cicloconceptos, 19)) + "|" + ALLTRIM(conceptos(cicloconceptos, 20)) + "|"
fputs(arch,cadena)
SKIP
ENDDO
FCLOSE(arch)
CLOSE DATABASES
WAIT "ARCHIVO GENERADO" WINDOW AT 5,75 TIMEOUT 2
Return
ELSE
MESSAGEBOX("El total de la factura no coincide con el total del detalle, favor de verificarlo",0+16,"AVISO DEL SISTEMA")
Return
Endif
Endif
endproc
Ademas por lo que medio veo en la ayuda de vfp pues lo del trigger te sirve más para validar campos que para hacer lo que hace un verdadero trigger, así que no te podría ayudar mayormente, lo que si te podría decir es que busques otra solución para que en un determinado momento te envíe a efectuar un proceso que es más o menos lo que hace un trigger, por ejemplo creo que cuando tu grabas un registro quieres que se te agregue a un txt y eso lo puedes hacer en el momento de grabar el registro ahí llamas al programa que te inserta el registro en el txt
jefazo, en todo tienes razón, solo que hay un pequeño problema...
La información la estoy tomando de unas tablas libres que maneja un paquete del cual no cuento con los programas fuente, (ya que es un paquete comercial, osea tine un costo y licencia) es por ello que necesito del trigger para que pueda funcionar la aplicación que te acabo de mostrar.
Espero que me comprendas y no te enojes oriéntame, que de antemano estoy super agradecido por ponerme la atención y que me estés ayudando de una o de otra forma. Gracias...
Creo que en la pregunta anterior ya te di una orientación, aunque como te digo yo tampoco he trabajado con triggers al menos no a nivel de vfp
Muchas gracias por tus ganas y entusiasmo, perdoname por el tiempo que le estas dedicando, y pues seguiré investigando, porque se debe de poder hacer, así que no me desanimo, al contrario, si encuentro la respuesta me permites que te la haga saber.
Gracias...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas