PDA

Ver la Versión Completa : Problema con Código y Guardar en base de datos


DiegoPucho
09-06-2018, 19:44:00
Hola a todos de ante mano, para seguir preguntando cosas sencillas pero me trabo y no se como conseguir lo que quiero.
Les cuento que estoy aprendiendo y hace muy poco que estoy con delphi, lo que encuentro sumamente interesante. Lo que espero que me tengan paciencia. También les cuento que es por voluntad propia y no tengo ha nadie que le pueda preguntar, por supuesto los tengo a ustedes.;)

Aquí el problema, Tengo un Form de productos donde guardo en una base de datos (creo que es plana, se guarda en la maquina)... tengo edit y más.

1° Ordenar Código. (esta bien lo que hice?) Código donde intento guardar en base de datos.
procedure TTFormNuevoProducto.BtnGuardarClick(Sender: TObject);
begin
With FrmModArt.QProductos do
begin
if Locate('Codigo',EditCodigo.Text,[]) then //Si Codigo se duplica manda mensaje.
begin
MessageDlg('Este Código de Producto ya existe.', mtWarning, [mbOK], 0);
EditCodigo.SetFocus;
EditCodigo.Color:=clSkyBlue;
end
else
if Trim(EditDescripcion.Text) = '' then //Si Descripcion esta vacio manda mensaje.
begin
ShowMessage('Debe Ingresar la Descripción del Producto.');
EditDescripcion.SetFocus;
EditDescripcion.Color:=clSkyBlue;
end
else
if Trim(EditCodigo.Text) = '' then //Si Codigo esta vacio manda mensaje.
begin
ShowMessage('Debe Ingresar un Código del Producto.');
EditCodigo.SetFocus;
EditCodigo.Color:=clSkyBlue;
end
else
begin
FrmModArt.QProductos.Insert; ///Acá abre base de Datos para Insertar.
try
FrmModArt.QProductos.FieldByName('Codigo').Text:= EditCodigo.Text;
FrmModArt.QProductos.FieldByName('Descripcion').Text:= EditDescripcion.Text;
...
FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue; /// acá el 2° problema.
FrmModArt.QProductos.FieldByName('FechaCompra').Text:= sDateEdit1.Text; /// acá el 3° problema.
...
FrmModArt.QProductos.Post; /// acá se guarda los datos.
TFormNuevoProducto.EditCodigo.Clear;
TFormNuevoProducto.EditDescripcion.Clear; /// acá se borra los datos que contiene los componentes.
TFormNuevoProducto.ComboBoxProveedor.KeyValue := '';
...
TFormNuevoProducto.sDateEdit1.Clear;
...
TFormNuevoProducto.EditCodigo.SetFocus; /// Le devuelve el focus al edit Código.
except
on E:Exception do
begin
MessageDlg('ErrorN°: 175 ' + E.Message, mtWarning, [mbOK], 0);
end;
end;
end;
end;
end;
2° en el ComboBoxProveedo y 3° sDateEdit1.Text en cuando intento guardar (sin proveedor y sin fecha) me sale mensaje de error Null.
Aqui mensaje completo del 2°: Could not convert variant of type (Null) into type (OleStr)
Lo que he intentado es por código algo así. Ya q el problema es que no me deja guardar Null (vació) en mi tabla. y en el 3° no me guarda _/_/_.
if Trim(ComboBoxProveedor.Text) = '' then
begin
FrmModArt.QProductos.FieldByName('idProveedor').Value := NULL;

FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue;
end;
Quiero decirle que SI esta vacío ENTONCES ... haga lo primero SINO lo guarde... (y no puedo hacer eso) Es muy pobre MyCodigo...
Y en el 3° hacer algo similar...
Desde ya muchas gracias y espero no molestarlos con mis PREGUNTONTAS... :D

Casimiro Notevi
09-06-2018, 20:04:22
Para estas cosas es perfecto el libro este (http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_4_pdf_.zip). Te harás un experto si acudes al mismo.
Para cosas como esta:FrmModArt.QProductos.FieldByName('FechaCompra').Text:= sDateEdit1.Text; /// acá el 3° problema.
La base de datos debe tener el campo FechaCompra del tipo fecha, según la base de datos que utilices será date, datetime, timestamp, etc.
Y pondrías algo así:
......QProductos.FieldByName('FechaCompra').DateTime := ......
Porque no creo que estés guardando las fechas en modo texto, imagino.

DiegoPucho
09-06-2018, 20:44:50
gracias Casimiro, siempre estas pendiente... espero no ofenderte... el libro ya lo descargue, se me complica leerlo desde la maquina... (soy mas chapada a la antigua: Papel). Pero ya me voy a poner a leerlo...
Porque no creo que estés guardando las fechas en modo texto, imagino.
Buen punto. (.) Mayusculo. :D . No se puede guardar en modo texto.??? Por que??? Preguntas facultativas. :rolleyes:

FrmModArt.QProductos.FieldByName('idProveedor').Text: -> Pasaría lo mismo??

Casimiro Notevi
09-06-2018, 22:47:06
Si quieres, por ejemplo, calcular cuántos días han pasado entre varias fechas, o mostrar registros ordenados por fecha, o sumar/restar fechas, etc. lo ideal es guardar fechas. (Una fecha es realmente un número con decimales, por lo que facilita hacer cálculos con ellas).
El código del proveedor normalmente será un número, aunque si usas letras, tendrás que guardarlo como varchar.

Ten en cuenta que la estructura de la base de datos es como la estructura de un edificio, sus cimientos, columnas, etc.
Y el programa es como las paredes, que puedes poner en un sitio u otro, pintar de distintos colores, etc.

Pero con una buena estructura siempre tendrás una buena base para tu programa/edificio. Si la estructura es mala, luego te encontrarás con problemas, se puede derrumbar/caer, no podrás poner más plantas/pisos, no podrás mover paredes, etc.

La estructura es esencial.
Lee el libro ;)

DiegoPucho
10-06-2018, 01:32:05
Hola casimiro de nuevo, pero en la propiedad que mencionas:
......QProductos.FieldByName('FechaCompra').DateTime := ......
No me sale la propiedad DateTime, solo AsDateTime... (es lo mismo?)
De la forma que estaba me guarda el valor, el problema es cuando esta vació el campo. Si lo guarda no creo que sea el problema de como lo guardo.
Quiero decirle que si esta vació.... entonces... desactivarlo... sino guardarlo... (Pero no puedo)...
if Trim(ComboBoxProveedor.Text) = '' then
begin
FrmModArt.QProductos.FieldByName('idProveedor').Value := NULL;
/// Acá no se que poner (if vacio the Null sino que lo guarde).
FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue;
end;

Y ya lo estoy leyendo al Libro... Espero que me ayuden...

DiegoPucho
10-06-2018, 08:25:47
hice traducción del else mal... es sino...
ya solucione el 1° así:
if Trim(ComboBoxProveedor.Text) = '' then
begin
FrmModArt.QProductos.FieldByName('idProveedor').Value := NULL;
end
else
begin
FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue;
end;

Pero no lo consigo con el 2° lo hice igual y nada...:(

DiegoPucho
10-06-2018, 09:49:34
Logre solucionar el 2° Problema de la siguiente manera:
if sDateEdit1.Text = (' / / ') then
begin
FrmModArt.QProductos.FieldByName('FechaCompra').Value := NULL;
end
else
begin
FrmModArt.QProductos.FieldByName('FechaCompra').Text:= sDateEdit1.Text;
end;
Espero que a alguien le sirva...:D

Casimiro Notevi
10-06-2018, 14:07:20
No me sale la propiedad DateTime, solo AsDateTime... (es lo mismo?)No recuerdo de memoria, es que estoy cambiando de lenguajes durante todo el día, de unos a otros. Sí, será asdatetime.