Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   query no Graba , se cierra (https://www.clubdelphi.com/foros/showthread.php?t=38363)

juanmaster 12-12-2006 18:29:45

query no Graba , se cierra
 
Hola buenos dias ;dios los vendiga
el problema que tengo es el siguiente
procedure TFclienteN.BitBtn1Click(Sender: TObject);
begin
with Query1 do
begin
close;
sql.clear;

SQL.add('INSERT INTO clientes (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono,)');
SQL.add ( 'VALUE ('+ inttostr (edit6.text)+','+edit1.Text+','+edit3.Text+','+edit4.text+','+edit2.Text+','+edit4.Text+')');

end;es el codigo de un voton quiero que graba y quiero cambiar el valor de el edit uno a integer inttostr (edit6.text) pero me da erroer cuando ago esa comvercion

Lepe 12-12-2006 18:44:28

Lo que espera intToStr es un entero, sin embargo lo que hay en el Edit6 es un texto, de ahí que dé error.

Debes tener en cuenta los tipos de datos:
Imaginando que IDCLIENTE es un entero, el sql debe quedar así:
Código SQL [-]
INSERT INTO clientes (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono)
VALUE (3, 'nombre1', 'apellido1', 'direccion 1', 'cedula', '23234223');
tal y como lo haces ahora mismo quedaría así:
Código SQL [-]
INSERT INTO clientes (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono)
VALUE (3, nombre1, apellido1, direccion 1, cedula , 23234223);

Como ves no hay comillas simples para que el sql entienda que nombre1 es un texto, deberás usar algo así:
Código Delphi [-]
SQL.add('INSERT INTO clientes (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono,)');
SQL.add ( 'VALUE ('+ edit6.text)+','+QuotedStr(edit1.Text)+','+QuotedStr(edit3.Text)+','+QuotedStr(edit4.text)+','+Quoted  Str(edit2.Text)+','+QuotedStr(edit4.Text)+')');

como ves es bastante lioso, es preferible usar parámetros en el sql

Saludos

juanmaster 12-12-2006 18:47:17

Base de datos en access , idcliente lave primaria , y es numerica
Recuerda que no me graba , el codigo

Lepe 12-12-2006 19:24:44

Pues muchas gracias, parece que me has leído la mente :p

La verdad, inicialmente creí que era problemas por los tipos de datos que enviabas y los que la base de datos esperaba, así que hice las preguntas a las cual has contestado.

Revisando el código entendí por donde iban los tiros y edité mi mensaje cambiándolo totalmente, mientras redactaba el mensaje se ve que has llegado.

Bueno espero que ahora si leas mi mensaje anterior.

Saludos

Caral 12-12-2006 19:45:06

Hola juanmaster
Segun veo:
Código Delphi [-]
procedure TFclienteN.BitBtn1Click(Sender: TObject);
begin
with Query1 do
begin
close;
sql.clear;

SQL.add('INSERT INTO clientes (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono,)');
SQL.add ( 'VALUE ('+ inttostr (edit6.text)+','+edit1.Text+','+edit3.Text+','+edit4.text+','+edit2.Text+','+edit4.Text+')');

end;
No se porque pero me suena que cierras, la tabla y luego tratas de insertar.
Para mi nunca insertaras nada en un query o tabla cerrado.
Yo lo haria asi:
Código Delphi [-]
procedure TFclienteN.BitBtn1Click(Sender: TObject);
begin
 Query1.Close;
 Query1.sql.clear;
 Query1.Open;
 Query1.SQL.TEXT:= 'INSERT INTO clientes (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono)' +
 'VALUE ('+ inttostr (edit6.text)+','+edit1.Text+','+edit3.Text+','+edit4.text+','+edit2.Text+','+edit4.Text+')';
end;
Puede ser que me equivoque en el open, si no camina asi, ponlo antes del end.
Saludos

AzidRain 12-12-2006 19:53:17

Código Delphi [-]

procedure TFclienteN.BitBtn1Click(Sender: TObject);
//Version mejorada, mas legible y mas potente
begin
with Query1 do
       begin
  close;
  sql.clear;
  // Ponenmos la setencia SQL pero parametrizada
   SQL.add('INSERT INTO clientes   (IDcliente,Nombre_Cliente,Apellido,Dirreccion,Cedula,Telefono,)' );
SQL.add ( 'VALUES( :edit6,:edit1, :edit3,:edit4,:edit2,:edit4)' );

//Asignamos valores a los parametros:

 ParamByName('edit1').AsString := edit1.Text;
 ParamByName('edit2').AsString := edit2.Text;
 ParamByName('edit3').AsString := edit3.Text;
 ParamByName('edit4').AsString := edit4.Text;
 ParamByName('edit6').AsString := edit6.Text;
// Delphi hace la conversión de tipos, en caso de que no se pueda asigna un null. Por ejemplo si pusiste una letra y el campo espera numeros..se coloca un null

//Grabamos los datos

ExecSQL;

    end;
El codigo anterior queda mas legible y no necesitas concatenar cadenas para formar la sentencia. Obviamente tienes que validar los Edits para que los que tengan que llevar solo números efectivamente los lleven para que al momento de hacer el query no haya problema.

juanmaster 12-12-2006 21:23:05

probelma resuelto , ahora necestito es savar el la cantidad maxima del idcliente , para cuando balla a a pedir un regostro nuevo m genere un numero de idcliente que estaba mas uno
DBEdit2.SetFocus;
DBEdit1.text:=1+query1.sql.Add('select max(idcliente)from clientes');
quiero buscar el idcliente el registro mas alto y sumarle uno para que se genere progresibamente los numeros
pero el codigo esta malo :s

AzidRain 12-12-2006 21:57:36

Código Delphi [-]
DBEdit2.SetFocus;
DBEdit1.text:=1+query1.sql.Add('select max(idcliente)from clientes'); // Esto no va...
Código Delphi [-]
Query1.Clear;   //Limpiamos por si habia SQL guardado ahi
Query1.SQL.Add('select max(idcliente)+1 as sig_cliente from clientes');
Query1.Open;
DBEdit1.text:=  Query1.FieldByName('sig_cliente').AsString;
Query1.Close; // Cerramos el query pues ya no lo necesitamos.

Te recomiendo usar mejor un campo autoincrementado para guardar idcliente, de esta forma el motor de BD automáticamente irá aumentándo el número y nos ahorramos todo el código anterior.

juanmaster 12-12-2006 22:18:29

perdon pero tengo el campo id cliente auto increme pero me;

me da error lo que me diste dataset no int edit or insert mode

AzidRain 12-12-2006 23:52:21

Si pusieras un poco más de código seria mas facil para todos...No se en que momento ejecutas las rutinas de tu código (después de postear?, antes del siguiente Edit?) Si estas insertando un nuevo registro entonces debes llamar a Insert en algun lado antes de volver a editar los datos con los TDBEdits
Código Delphi [-]

QuerySinNombre.Insert;  //Cmabiale a como se llame tu query.

// Todo lo de aqui abajo seguramente puede ir en un dialogo que se abra para pedir datos
Query1.Clear;   //Limpiamos por si habia SQL guardado ahi
Query1.SQL.Add('select max(idcliente)+1 as sig_cliente from clientes');
Query1.Open;
DBEdit1.text:=  Query1.FieldByName('sig_cliente').AsString;
Query1.Close; // Cerramos el query pues ya no lo necesitamos.

// Aqui cerrarias tu dialogo y dependiendo si fue OK o Cancel haces el Post

If  VentanaSinNombre.modalresult := mrOk Then
   QuerySinNombre.Post; 
else
  QuerySinNombre.Cancel;

Todo lo anterior es código genérico solo tienes que traslaparlo a l que estas haciendo pero te repito si nos dieras mas código sería mas fácil y no tendríamos que estar adivinando


La franja horaria es GMT +2. Ahora son las 09:57:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi