accesar a funciones de usuarios en modulos de ms access
#1
Escrito 12 octubre 2012 - 01:17
necesito su ayuda please, tengo un adoquey con una sentencia sql, esta sentencia utiliza una funcion que programe con vba en un modulo de access.
cuando ejecuto la setencia en delphi atravez del adoquery no funciona.
les agradecere su ayuda.
#2
Escrito 12 octubre 2012 - 01:29
Con eso podremos comprender mejor tu problemática.
Saludos
#3
Escrito 12 octubre 2012 - 01:40
Esta query funciona bien en access, pero en delphi no, me dice que no reconoce la funcion
SELECT
proveedores.Nombre AS proveedor,
Clientes.Nombre AS cliente,
REG_GARANTIA.serie,
REG_GARANTIA.Codpro,
REG_GARANTIA.Producto,
REG_GARANTIA.Problema,
REG_GARANTIA.estado_telefono,
REG_GARANTIA.FECHA_INGRESO,
REG_GARANTIA.FECHA_ENVIO,
Dias_sin_fin_semana(REG_GARANTIA.FECHA_ENVIO,DATE()) AS DIAS
FROM
(REG_GARANTIA INNER JOIN Clientes ON REG_GARANTIA.CodCli=Clientes.CodCli) INNER JOIN proveedores ON REG_GARANTIA.ID_PROVEEDOR=proveedores.registro
WHERE
REG_GARANTIA.ID_ESTADO)=2;
#4
Escrito 12 octubre 2012 - 02:25
saludox
#5
Escrito 12 octubre 2012 - 02:27
El problema es con la funcion "Dias_sin_fin_semana", esta yo la hize y la almacene en un modulo de access...
Exacto, ése es el problema. Intenta convertir tu función externa de VisualBASIC a una función INTERNA de Delphi que te envíe los datos procesados para "pegarlos" a tu sentencia SQL.
#6
Escrito 12 octubre 2012 - 02:37
#7
Escrito 12 octubre 2012 - 03:02
El problema que tengo es necesito hacer ese calculo de esos dias y luego filtrar los datos para un reporte. pero si hago mi funcion en delphi no puedo filtrar esos datos por mi valor calculado
¿Y por qué no? A ver, explícanos.
¿Qué tiene de especial ésa función que no se puede reproducir su funcionalidad en Delphi?
#8
Escrito 12 octubre 2012 - 03:26
gracias por su ayuda
#9
Escrito 12 octubre 2012 - 03:31
si se puede hacer en delphi, es mas la traduje de delphi a vba, pero ya resulvi mi problema, pense que no se podia filtrar datos con campos calculados pero ya averigue como.
gracias por su ayuda
Sería muy bueno amigo mio que compartieras tu solución para otros compáñeros que llegasen a tener el mismo problema...
Saludos..
#10
Escrito 12 octubre 2012 - 03:49
hice esta función en un modulo de acces para calcular los días entre dos fecha sin contar sabado y domingo.
Public Function Dias_sin_fin_semana(Desde As Date, Hasta As Date) As Integer Dim dias As Integer Dim i As Date dias = 0 i = Desde Do While i <= Hasta If Weekday(i, 1) >= 2 And Weekday(i, 1) <= 6 Then dias = dias + 1 End If i = i + 1 Loop Dias_sin_fin_semana = dias End Function
Luego use esta función en una query de access que quize utilizar en delphi, pero mis compañeros del foro me explicaron que no puedo usar esta funciones desde delphi.
SELECT
proveedores.Nombre AS proveedor,
Clientes.Nombre AS cliente,
REG_GARANTIA.serie,
REG_GARANTIA.Codpro,
REG_GARANTIA.Producto,
REG_GARANTIA.Problema,
REG_GARANTIA.estado_telefono,
REG_GARANTIA.FECHA_INGRESO,
REG_GARANTIA.FECHA_ENVIO,
Dias_sin_fin_semana(REG_GARANTIA.FECHA_ENVIO,DATE()) AS DIAS
FROM
(REG_GARANTIA INNER JOIN Clientes ON REG_GARANTIA.CodCli=Clientes.CodCli) INNER JOIN proveedores ON REG_GARANTIA.ID_PROVEEDOR=proveedores.registro
WHERE
REG_GARANTIA.ID_ESTADO)=2;
asi que decidi eliminar esa funcion de la query y cree la funcion en delphi para hacer el calculo en delphi, pero necesitaba hacer un filtro de registros. usando el mismo campo calculado
aqui esta mi funcion en delphi
function Dias_sin_fin_semana(desde, hasta: double): integer; var dias:integer; i:Double; begin dias:=0; i:=desde; while i <= hasta do begin if (DayOfWeek(i) >=2) and (DayOfWeek(i) <=6) then dias := dias + 1; i:=i + 1; end; result:=dias; end;
Realize mi calculo en delphi usando un campo calculado
procedure TDmReport_Garantias.REVISION_PROVEECalcFields(DataSet: TDataSet); begin REVISION_PROVEEDIAS.AsFloat:=Dias_sin_fin_semana(REVISION_PROVEEFECHA_ENVIO.AsDateTime,Date); end;
Aplique mi filtro sobre el campo calculado. usando el evento OnFilterRecord que se ejecuta despues del evento open del TAdoquery.
procedure TDmReport_Garantias.REVISION_PROVEEFilterRecord( DataSet: TDataSet; var Accept: Boolean); begin Accept := REVISION_PROVEEDIAS.AsFloat > 20; end;
Hay que tener el cuidade de poner a True la propiedad Filtered, antes llamar el evento open
REVISION_PROVEE.Close; REVISION_PROVEE.Filtered:=True; REVISION_PROVEE.Open;
Espero me halla explicado bien
#11
Escrito 12 octubre 2012 - 04:00
#12
Escrito 12 octubre 2012 - 04:57
Saludox !