PDA

Ver la Versión Completa : reconocer que un campo contiene datos


enecumene
12-09-2007, 02:12:24
Hola Compañeros del foro, tengo una nueva inquietud, es la siguiente: como hago que cuando realizo un insert o un post me reconozca en la base de datos que en el campo a insertar contiene datos?. me explico:

en la tabla tengo estos campos:

tipo1
tipo2
tipo3

verdad? cuando haga una inserción o un update, si en tipo1 tiene datos me grabe entonces en tipo2 y asi sucesivamente, estaba tratando de hacerlo con un if...else:


if ADOTable.Fields[0].Value = ???? then <---AQUI no se que poner
begin
////////
end else Begin....


no se si me hice entender por favor no duden en pedirme explicarles de nuevo

Saludos...

Rudi
12-09-2007, 04:10:16
Hola enecumene.-

If ADOTable1.Fields[0].IsNull then

espero sea esto lo que buscas.

enecumene
12-09-2007, 14:50:37
Hola Rudi, Disculpa La Tardanza, estaba roncando:D, ahorita mismo lo practico a ver como me resulta.

Saludos...

enecumene
13-09-2007, 00:13:15
Hola Rudi, Buenas tardes, tu consejo no me funciono, lo estoy haciendo de esta manera, pues no me funciona, estoy seguro que estoy fallando, a ver:

procedure TFFactura.BitBtn1Click(Sender: TObject);
begin
if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
begin
if ZPedido.Fields[19].IsNull then <--Si el campo no tiene datos entonces:
begin
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef_2='+Quotedstr('Sí')+', oc_no_sigef='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end else begin
if not ZPedido.fields[19].IsNull then <--si el campo tiene datos entoces:
begin
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef1='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end else begin
if not ZPedido.Fields[42].IsNull then <--SI el campo anterior tiene datos entonces:
begin
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef2='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end;
end else
showmessage('No hago nada, no estoy editando');
end;
end;
end;
end;
end;
end;

se que hay una mejor manera de hacerlo, ojala me puedan ayudar :(.

Saludos.

Rudi
13-09-2007, 00:48:10
Hola comprobé esto:

if ADOTable1.Fields[0].IsNull then
ShowMessage('isnull funciona: valor true')
else
ShowMessage('isnull funciona: valor false');

if ADOTable1.Fields[0].Value=null then
ShowMessage('Value funciona: valor true')
else
ShowMessage('value funciona: valor false');


y me funciono, están las dos posibles formas: .isnull y .value=null

revisa bien porque a mi me funcionó

enecumene
13-09-2007, 01:03:13
gracias rudi ahora mismo lo estoy revisando

enecumene
13-09-2007, 01:20:38
Hola Rudi, Lamentablemente no funciona de la manera que quiero:

procedure TFFactura.BitBtn1Click(Sender: TObject);
begin
if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
begin
if ZPedido.Fields[19].Value=Null then
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef_2='+Quotedstr('Sí')+', oc_no_sigef='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end
else
if ZPedido.fields[19].Value=Null then
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef1='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end
else
if ZPedido.Fields[42].Value=Null then
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef2='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end;
end else
showmessage('No hago nada, no estoy editando');
end;

por ejemplo, en el primer If cuando el campo tipo1 no tiene datos executa la consulta de lo contrario me debe executar el segundo if, no? si en el segundo if el campo tipo1 y tipo2 tienen datos entonces me deberia executar el tercer if llenar el campo tipo3, no se si me hice entender, porque aunque el campo tipo1 tenga datos me excuta el primer if cuando me deberia executar el segundo if.:confused::confused:

enecumene
13-09-2007, 02:14:43
tambien intente esto pero no me hace nada:

procedure TFFactura.BitBtn1Click(Sender: TObject);
begin
if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
begin
if ZPedido.Fields[19].AsString = ' ' then
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef_2='+Quotedstr('Sí')+', oc_no_sigef='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end;

if (ZPedido.Fields[19].AsString <> ' ') and (ZPedido.Fields[42].AsString = ' ') then
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef1='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end;

if (ZPedido.Fields[42].AsString <> ' ') and (ZPedido.Fields[43].AsString = ' ') then
if ZFactura.State in [dsedit,dsinsert] then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef2='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ShowMessage(ZRegPed.SQL.Text);
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
end;
end else
showmessage('No hago nada, no estoy editando');
end;

que quebradera!!:D

Rudi
13-09-2007, 03:46:59
Hola enecumene.-

Es extraño, estas seguro que el campo que quieres comprobar es el 19?
has revisado con breakpoints y watches los valores de la comparación?

intenta utilizar para estar bien seguros FieldByName('NombreCampo') en lugar de Fields[n] es decir:


actual: if ZPedido.Fields[19].Value=Null then
.
intenta:if ZPedido.FieldByName('NombreCampo').Value=Null then


vamos probando para ver que pasa, pero comprueba como te dije antes, si es que no lo has hecho, los valores de los datos a comparar en el primer caso ZPedido.Fields[19].Value y vamos viendo que nos va dando.

b3nshi
13-09-2007, 06:52:46
No me tome el tiempo de ponerme a leer bien q es lo q quieres hacer, pero porq no pruebas:


if ZPedido.Fields[1].AsString <> ' ' then
//tiene algo


{Saludos}

enecumene
21-09-2007, 03:40:08
disculpen la demora estaba trabajando en otros temas, bien, vuelvo con este asunto, intenté hacerlo como rudi me lo sugirio:

procedure TFFactura.BitBtn1Click(Sender: TObject);
begin
if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes then
if CheckBox1.Checked = True then
begin
if (DBEdit1.Text = '') or (DBEdit20.Text = '') then
MessageDlg('Debes ingresar un número de O/C o Casa Comercial',mtError,[mbOK],0)
else
if ZFactura.State in [dsedit,dsinsert] then
begin
if ZPedido.FieldByName('oc_no_sigef').Value=null then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef_2='+Quotedstr('Sí')+', oc_no_sigef='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
MessageDlg('Los Datos se grabaron exitosamente!',mtConfirmation,[mbOK],0);
end;

if (ZPedido.FieldByName('oc_no_sigef').Value <> null) and (ZPedido.FieldByName('oc_no_sigef2').Value=null)then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef1='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
MessageDlg('Los Datos se grabaron exitosamente!',mtConfirmation,[mbOK],0);
end;

if (ZPedido.FieldByName('oc_no_sigef').Value <> null) and (ZPedido.FieldByName('oc_no_sigef1').Value <> null) then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef2='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
MessageDlg('Los Datos se grabaron exitosamente!',mtConfirmation,[mbOK],0);
end;
end;
end else begin
if (DBEdit20.Text = '') or
(DBEdit21.Text = '') or
(DBCheckBox1.Checked = False) then
MessageDlg('Debes cotejar Compras por el fondo, ingresar Casa Comercial o No. de Recibo!',mtError,[mbOK],0)
else
if ZFactura.State in [dsedit,dsinsert] then
begin
ZFactura.Post;
ZFactura.Insert;
MessageDlg('Los Datos se grabaron exitosamente!',mtConfirmation,[mbOK],0);
end;
end;
DBCheckBox1.Checked:=False;
CheckBox1.Checked:=False;
end;

esta es la parte que me da problemas:

if ZPedido.FieldByName('oc_no_sigef').Value=null then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef_2='+Quotedstr('Sí')+', oc_no_sigef='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
MessageDlg('Los Datos se grabaron exitosamente!',mtConfirmation,[mbOK],0);
end;

if (ZPedido.FieldByName('oc_no_sigef').Value <> null) and (ZPedido.FieldByName('oc_no_sigef2').Value=null)then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef1='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;
MessageDlg('Los Datos se grabaron exitosamente!',mtConfirmation,[mbOK],0);
end;

if (ZPedido.FieldByName('oc_no_sigef').Value <> null) and (ZPedido.FieldByName('oc_no_sigef1').Value <> null) then
begin
ZRegPed.SQL.Clear;
ZRegPed.SQL.Add('UPDATE reg_pedidos SET oc_no_sigef2='+Quotedstr(DBEdit1.Text)+'');
ZRegPed.SQL.Add(' WHERE no = '+Quotedstr(DBEdit15.Text)+' ');
ZRegPed.ExecSQL;
ZFactura.Post;
ZFactura.Insert;

el campo oc_no_sigef contiene datos que esta en el primer if, lo mas logico es que me execute el segundo if pero no lo hace aun teniendo datos me sobreescribe el campo, no se mas nada que hacer, me dan ganas de estrellarme contra el monitor!!!!:D

Saludos

waly2k1
21-09-2007, 05:16:28
Estoy viendolo si queres lo seguimos un poco

Veo algo así:
ZFactura.Post;
ZFactura.Insert;


A que haces post ?, y despues insert ?
Ejecutas la consulta y nada mas, no entiendo el post ni el insert, lo veo mejor y te comento...

No uses = <> null sino
if tabla.FieldByName('Campo').IsNull then
begin
end;

ó
if not tabla.FieldByName('Campo').IsNull then
begin
end;

waly2k1
21-09-2007, 05:36:02
Bueno he visto un poco
Para empezar si no estás modificando o dando de alta un registro deberia estar
deshabilitado/invisible el boton y no validas esto despues.
Y por favor tomate el trabajito de ponerle nombres un poco mas descriptivos a los DBEdit, sino
no sabes si lo que estas grabando es lo que realmente debería ser.
Ponés un punto de interrupción y fijate que los datos a guardar son correctos, sino en el
WHERE no encuentra nada y no hace nada hehe.

if ZPedido.FieldByName('oc_no_sigef').IsNull then
begin
Conx.Execute( 'UPDATE Reg_Pedidos SET OC_No_Sigef1=' + QuotedStr(DBEdit1.Text) + ' WHERE no=' + QuotedStr(DBEdit15.Text) );
// Conx es la conexion que usa la consulta (ADO)
end;


Probá con esto y me comentas

enecumene
21-09-2007, 16:53:02
Gracias waly2k1 (http://www.clubdelphi.com/foros/member.php?u=14941), pero lamentablemente no funciona, quite el post e insert y lo puse una sola vez que es despues de los updates, ya que lo vi mejor estaban de mas, quite los <>= y puse isnull, lo que me hace como siempre lo ha hecho es grabar en el primer campo y si tiene datos me los sustituye. ya estoy optando por estrellarme contra el monitor:D.

Saludos.

enecumene
21-09-2007, 17:38:56
Gracias waly2k1 (http://www.clubdelphi.com/foros/member.php?u=14941), pero lamentablemente no funciona, quite el post e insert y lo puse una sola vez que es despues de los updates, ya que lo vi mejor estaban de mas, quite los <>= y puse isnull, lo que me hace como siempre lo ha hecho es grabar en el primer campo y si tiene datos me los sustituye. ya estoy optando por estrellarme contra el monitor:D.

Saludos.

waly2k1
22-09-2007, 08:44:19
Amigo antes de estrellarte dejame en tu testamento algo please!
Lo que te pasé no puede fallar. Eso anda acá, en la China y en Marte, seguí la lógica de tu sistema, que seguro en algún lado la estás pifeando. En 1º año de facultad lo llamaban logica de tres mayores, en tu caso es distinto ya que no hay 3 numeros sino valores inexistentes o vacios que te fallan. Prueba de escritorio!!!, lapiz papel, cigarrillos y Coca Cola...

De todas maneras si ya existe no podría pisar los datos, si no existe que los de de alta. No puede ser mas facil!!!
Focalizate en los If, no debe ser if ... then, sino seguilo con el debugger y verás que hace algo imprevisto!
sino
if ... then
else
if then
else
else....

no if anidados que comparan valores después de cambialos.

Saludos!