PDA

Ver la Versión Completa : Duda con fechas


Paulao
12-10-2010, 19:47:17
En mi proyecto, puzo un campo fecha que viene de un cxDateEdit de DevExpress. En el servidor de aplicaciones, tengo una función que haz gravar en el Banco de Datos, asi:
'Insert Into Mi_Tabla(Campo_date) values (' + DateToStr(variable_date);
Esto me lo tre un valor NULL y no es NULL, pues si yo hago asi:
ShowMessage(DateToStr(variable_date)); Funciona. Con certeza estas en la linea "DateToStr()", pues yo tengo un campo DateTime en el banco. Vea mi codigo completo desta funcion en el servidor:
function InsereOrdemProducao(Conn: TZConnection;s_ordem,s_lote,s_produto,s_valid_lote:string;dt_fab: TDateTime;qde_prod: Double;resp_tec:Integer): OleVariant;
var
Sql:string;
cdsGeral: TZQuery;
begin
Result := False;
cdsGeral := NovoDataSet(Conn);
sql := 'INSERT INTO ORDEM_PRODUCAO(NRO_ORDEM,NRO_LOTE,PRODUTO,LOTE_VALIDADE,DT_FABRICA,QDE_PRODUZIR,RESP_TECNICO)VALUES( ' +
s_ordem + ',' + s_lote + ',' + s_produto + ',' + s_valid_lote + ',' + DateToStr(dt_fab) + ',' +
FloatToStr(qde_prod) + ',' + IntToStr(resp_tec) + ')';
try
cdsGeral.SQL.Text := Sql;
cdsGeral.ExecSQL;
Result := True;
cdsGeral.ApplyUpdates;
except
Result := False;
end;
cdsGeral.Close;
FreeAndNil(cdsGeral);

end;
Y abajo es la llamada a la función, por el client:
procedure TfrmOrdemProducao.cxButton1Click(Sender: TObject);
begin
if InsereOrdemProducao(quotedstr(edtNroProd.Text),quotedstr(edtNroLote.Text),quotedstr(edtDescricao.Tex t),
quotedstr(edtValidLote.Text),edtDtFabric.Date,edtQde.Value,1) then
ShowMessage('Orçamento realizado com sucesso!')
else
ShowMessage('Erro ao tentar gravar orçamento');
end;

Uso Delphi 7, MySql 5, Zeos y MultiTier.

Paulao
12-10-2010, 19:53:34
Me olvide de otra llamada de Client para servidor es hecha asi:
function InsereOrdemProducao(s_ordem,s_lote,s_produto,s_valid_lote:string;dt_fab: TDateTime;qde_prod: Double;resp_tec:Integer): Boolean;
begin
if not ConGeral.Connected then
ConGeral.Open;
Result := ConGeral.AppServer.ExecFuncao(INSERE_ORDEM_PRODUCAO,ArrayToStr([s_ordem,s_lote,s_produto,s_valid_lote,DateToStr(dt_fab),FloatToStr(qde_prod),IntToStr(resp_tec)]));
end;

Y en el Servidor tengo esta funcion que hace todo:
function LeFuncao(Conn: TZConnection; IDFuncao: Integer; Parametros: OleVariant): OleVariant;
begin
case IDFuncao of
INSERE_ORDEM_PRODUCAO: Result := InsereOrdemProducao(Conn,PegaItemLista(01,Parametros),
PegaItemLista(02,Parametros),
PegaItemLista(03,Parametros),
PegaItemLista(04,Parametros),
StrToDate(PegaItemLista(05,Parametros)),
StrToFloat(PegaItemLista(06,Parametros)),
StrToInt(PegaItemLista(07,Parametros)));

else
Result := '';
end;
end;

Paulao
12-10-2010, 20:00:26
Señores, una corecion. La fecha no estas NULL, pero asi:
12/10/2010 y creo que el MySql no acepta asi, pero como cambiar por el delphi?

ContraVeneno
12-10-2010, 20:06:12
En lugar de DateToStr, debes utilizar FormatDateTime para darle el formato que sí acepte MySQL, tambien debes de tomar en cuenta que podrían necesitarse comillas o símbolos para encerrar la fecha de acuerdo a MySQL...

En SQL Server se requieren comillas para encerras fechas:

SQL := 'Set @Date = ' + QuotedStr(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now));

esto resulta en:

Set @Date = '2010-10-12 12:47:59'


No recuerdo en MySQL pero creo que debería ser #2010-10-12#


Para mi la mejor opción sería Utilizar parámetros, con eso no necesitas de formatos y conversiones, ya que delphi lo hace solo:

with Query do begin
...
SQL.Clear;
SQL.Add('Set @Date = :ADateValue');
ParamByName('ADateValue').AsDateTime := Now;
...
end;

Paulao
12-10-2010, 20:23:02
Ok, pero si voy con el SQL generado por el programa y ejecutar directo en el Banco de Datos(EMS Lite for MySql), yo consigo grabar, pero por el programa(Delphi) me lo da error.

felipe88
12-10-2010, 22:34:42
Siguiendo la idea de ContraVeneno (lo más adecuado), es importante revisar la declaración de tipo de dato.

No manejo mucho MySQL, pero hagamos como ejemplo:
En la base de tados esta declarado como Date y en Delphi lo enviamos como DateTime, esto podría dar conflicto.
En otro ejemplo he visto el orden de paso de los valores, digamos, en la bd dd/mm/aaaa y en Delphi mm/dd/aaaa

Son ideas....


Saludos!

Paulao
12-10-2010, 22:36:30
Hizo, las coreciones, la fecha hizo un FormatDate('yyyy-MM-dd',var_date), pero no graba. Yo pego el SQL que es generado en mi aplicacion y si voy directo al MySql(EMS Lite for Mysql) funciona, pero por mi aplicacion no funciona. Que mas puede ser? No es el SQL, pues el si funciona directo en el banco.

felipe88
12-10-2010, 22:52:26
Hizo, las coreciones, la fecha hizo un FormatDate('yyyy-MM-dd',var_date), pero no graba. Yo pego el SQL que es generado en mi aplicacion y si voy directo al MySql(EMS Lite for Mysql) funciona, pero por mi aplicacion no funciona. Que mas puede ser? No es el SQL, pues el si funciona directo en el banco.

Aconsejaría usar un punto de quiebre (F5) para comprobar realmente como se pasa la variable sql al Query. Muchas veces se omiten o se van cosas que no son. Depronto puedas ver la solución


Saludos!

Paulao
12-10-2010, 23:10:14
Resolvi, pues mi servidor apuntava para otra unit, pues como hizo una copia del fuente, creo que si quedo aun con los path antiguos, pero estas listo.. Hizo las coreciones, pero ahora al grabar está mui despacio y si queda mui demorado y el erro es de TimeOut. No se lo puede ser ahora. Zeos o otra cosa, o mismo virus, no lo se, pero no graba por el timeout.