Ir al contenido


Foto

capturar un radiobutton y guardar en base datos?


  • Por favor identifícate para responder
34 respuestas en este tema

#1 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 23 abril 2016 - 06:04

Como hacer correctamente, si enredar innecesariamente el código con sentencias que sobran.

Como dispongo de un formulario de entrada de datos, si en este hay dos RadioButtons "hombre" y "mujer"

Preparo los datos para grabarlos:


php
  1. procedure TForm3.BitBtn1Click(Sender: TObject);
  2. begin
  3.  
  4. ZQuery2.SQL.Text := 'INSERT INTO "personas" (nombre, edad, sexo) VALUES (:nombre, :edad, :sexo)';
  5. ZQuery2.ParamByName('nombre').AsString:= form3.edit1.text;
  6. ZQuery2.ParamByName('edad').AsString:= StrToInt(form3.edit2.text);
  7.  
  8. // Aquí viene el problema, ya que el usuario puede cambiar con un click entre los dos radiobutton
  9. // tantas veces antes de grabarse en la base de datos
  10. ZQuery2.ParamByName('sexo').AsString:= 'hombre' ó 'mujer' según radiobutton pulsado.
  11.  
  12. Try
  13. ZQuery2.ExecSQL;
  14. except
  15.  
  16. end;
  17.  
  18.  
  19. // Involuntariamente, lo pensé resolver de esta manera, pero veo que no me sirve, ya que una vez
  20. // preparado todo los campos, estos al pulsar BitBtn1Click se graban en la base de datos. Pero me
  21. // da error en base de datos.
  22.  
  23. If (form3.RadioButton1.checked) then
  24. begin
  25. ZQuery2.ParamByName('sexo').AsString:='hombre';
  26. form3.RadioButton2.checked:=FALSE;
  27. else
  28. begin
  29. ZQuery2.ParamByName('sexo').AsString:='No';
  30. form3.RadioButton1.checked:=FALSE;
  31. end;

Pienso que debo usar los eventos "OnClick" de los radiobutton para cargar el Zquery2.ParamByName('sexo') según sea el radiobutton pulsado, o quizás hay alguna opción más "limpia" y rápida.

 

Un saludo


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 abril 2016 - 08:19

Utiliza TRadioGroup, agrega los items Hombre y Mujer, una por línea, declara una variable global del tipo string, llámalo sexo:


delphi
  1. type
  2. TForm1 = class(TForm)
  3. private
  4. { Private declarations }
  5. public
  6. { Public declarations }
  7. Sexo: String; //también puede estar en private
  8. end;

En el evento OnClick de RadioGroup haces esto:


delphi
  1. procedure TForm1.RadioGroup1Click(Sender: TObject);
  2. begin
  3. case RadioGroup.ItemIndex of
  4. 0: Sexo := 'Hombre';
  5. 1: Sexo := 'Mujer';
  6. end;
  7. end;

Nada más queda poner:


delphi
  1. ZQuery2.ParamByName('sexo').AsString := Sexo;

Saludos.


  • 0

#3 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 23 abril 2016 - 12:21

Gracias como siempre enecumene. Veo que iba mal encaminado...

 

Entiendo que declaras la variable "sexo"  a nivel global, porque esa variable "debe" salir del procedimiento OnClick de RadioGroup ya que

Zquery2.ParamByname('sexo').AsString:=sexo; está ubicado en otro procedimiento BitBtn1click.

 

Ese "public" que indicas a que form pertenecería?

 

Un saludo


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 abril 2016 - 12:36

Se supone que en el form actual.


  • 0

#5 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 23 abril 2016 - 01:28

Ok enecumene. A ver si va todo ok! ya comentaré... ;)

 

Acabo de probar, y es imposible grabar en la base de datos la variable "sexo". Revisado todos los campos en (CREATE, INSERT etc...) y siempre entro por el EXCEPT dando aviso de error.

 

Se que es por este campo "sexo" ya que si lo anulo y no lo inserto en la base de datos, se graba perfectamente el registro entero apareciendo en pantalla. 

 

Me están dando muchos problemas los campos a la hora de grabar en la base datos, por eso voy uno a uno creando campos nuevos para ir controlando la insercción.

 

 

saludos


  • 0

#6 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 23 abril 2016 - 01:35

No esta bueno tener esa variable global

 

En realidad tu problema se puede solucionar asi:


delphi
  1. qry.ParamByName('Sexo').AsString := RadioButton1.Items[RadioButton1.ItemIndex];

Pero lo mejor es tener una funcion que retorne ese valor:


delphi
  1. type
  2. TForm1 = class(TForm)
  3. ...
  4. private
  5. function GetSexoSeleccionado: string;
  6. end;
  7.  
  8. implementation
  9.  
  10. function TForm1.GetSexoSeleccionado: string;
  11. begin
  12. Result := RadioButton1.Items[RadioButton1.ItemIndex];
  13. end;

Y luego para asignar el parametro:


delphi
  1. qry.ParamByName('Sexo').AsString := GetSexoSeleccionado;

Lo bueno de la segunda alternativa, ademas de que el codigo es mas legible, es que si cambias el componente TRadioButton por otra cosa, solamente tenes que modificar la funcion GetSexoSelccionado para que siga retornando el string.

 

Asi parece trivial y tonto, pero si tenes el codigo de arriba de todo repartido en varias partes, se torna muy tedioso...


  • 0

#7 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 23 abril 2016 - 03:05

Probaré tambien Agustin_ortu como indicas, pero estoy algo cansado, con los problemas de grabación de los campos en la base de datos. Result como variable donde la declaro en "public"?

 

pero en tu codigo no aprecio referencia al RadioGroup1, debería sustituir RadioButton1 que tu indicas por RadioGroup1.


  • 0

#8 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 23 abril 2016 - 03:25

Me equivoque, es RadioGroup1

 

Result es una variable implicita en todas las function, no se declara


  • 0

#9 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 23 abril 2016 - 03:27

Me dí cuenta que Result, no es necesario, cierto!

 

Me da error de "List index (-1) out of bounds", creo que es por orden de los radiobuttons, pero cada uno tiene por orden el (0) y el otro (1).

 

Además en la variable Result guardaría "hombre" o "mujer" según click del los radibuttons? porque no veo que le pasemos el

string por ninguna parte.

 

 

Un saludo


  • 0

#10 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 23 abril 2016 - 04:42

En realidad he asumido que el ItemIndex no deberia ser nunca -1

 

Cuando no hay nada seleccionado, ItemIndex vale -1 y ese es el problema


  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 abril 2016 - 07:24

Se me olvidó comentar que debes inicializar la variable Sexo, pero Agustín te ha dado una solución más simple en una sóla línea.


  • 0

#12 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 03:41

En realidad he asumido que el ItemIndex no deberia ser nunca -1

 

Cuando no hay nada seleccionado, ItemIndex vale -1 y ese es el problema

 

Por defecto tengo a checked el radiobutton1 cuando arranca el proyecto, lo cual si hay algo seleccionado por defecto, luego puedo cambiar.

 

Si voy al componente TRadioGroup1 en la propiedad itemIndex = -1, será ese el problema, que puede cambiar? pero claro en la función

 

Result := RadioGroup1.Items[radioGroup1.ItemIndex]; como diferencia entre "hombre y "mujer"?

 

Nota: RadioButton1 y RadioButton2 están dentro del componente RadioGroup1.

 

El problema parece resuelto, pero seguimos sin grabar el string "hombre" o "mujer" en la base de datos. El problema del radioGroup1 era que este componente y no lo sabía, no es necesario insertar un componente radiobutton, sino que en la propiedad items del propio RadioGroup, ya puedo crear tantos como uno quiera. Vaya mi ingnorancia!

 

Pero, seguimos con no poder grabar el string una vez seleccionado, es como si todo lo que no sea entrada por TEdit.text no se grabara correctamente. Imprimo la variable "sexo" que me devuelve la función y sí aparece "hombre" o "mujer".He asignador directamente para probar:


php
  1. ZQuery2.ParamByName('sexo').AsString:='hombre'; // y tampoco me graba, error base datos.


  • 0

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 abril 2016 - 06:53

Imprime la consulta antes de execsql:

Showmessage(ZQuery.SQL.text);

Y fíjate si la consulta es correcta.
  • 0

#14 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 07:04

Imprime la consulta antes de execsql:

Showmessage(ZQuery.SQL.text);

Y fíjate si la consulta es correcta.

 

Pues me indica correcto: INSERT INTO "personas" (nombre, edad, sexo) VALUES (:nombre, :edad, :sexo);

Si elimino el campo "sexo" de la base de datos y grabo datos estos se graban bien con un Tedit.text. Incluyo añadiendo más campos a la estructura me graba, pero con el campo a elegir del RadioGroup1 nada.

 

Algun problema de estructura de la base de datos debe ser porque, sino otra cosa no la comprendo!.

 

 

Un saludo


  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 abril 2016 - 08:05

mmm, veamos, coloca un ZQuery2.prepare antes del ExecSQL.
  • 0

#16 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 24 abril 2016 - 08:21

La bola de cristal también me da error

No nos sirve de nada que nos digas 'me da error', es imposible ayudarte

Antes de saber programar es imperativo que aprendas a realizar buenas preguntas. Es una habilidad que te va a servir para muchas cosas en la vida

Debes proveer todo el contexto:

Cual es el error? Copia y pega la clase y el texto de la excepción

Cual es el código que produce problemas? En qué línea se produce el error?

En este caso, cual es la definición de la tabla? De que tipo es el campo sexo?

Estas complemente seguro de que el campo sexo existe en la tabla? Si muestras la tabla en un dbgrid con select *, se ve el campo sexo?
  • 1

#17 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 12:10

Cual es el error? Copia y pega la clase y el texto de la excepción

"El proyecto ha lanzado una excepción 'EZSQLExcepción' con el mensaje SQLError: SQL logic erroror missing database"
El archivo 'source\dbc\ZDbcSqliteUtils.pas en linea 250.

Linea 250: raise EZSQLException.CreatewithCode, Format (SSQLError1,[ConSettings.ConvFuncs.ZRawToString(Error,ConSetting^.ClientCodePage^.CP, Consetting^.CTRL.CP]));

DataModule1.ZQuery2.SQL.Text := 'INSERT INTO "personas" (nombre, edad, sexo) VALUES (:nombre, :edad, :sexo)';



delphi
  1. Datamodule1.ZQuery2.ParamByName('nombre').AsString:= form3.edit1.text;
  2. Datamodule1.ZQuery2.ParamByName('edad').Integer:=StrToInt(form3.edit2.text);
  3. showmessage(GetsexoSeleccionado);
  4. Datamodule1.ZQuery2.ParamByName('sexo').AsString:='hombre'; //Si elimino el campo 'sexo' graba perfectamente el registro.
  5. Try
  6. DataModule1.ZQuery2.ExecSQL;
  7. except
  8.   on E:Exception do // siempre entra por aquí.
  9.   begin
  10.     ShowMessage('El nombre de la persona está duplicado!: '+E.Message); //E.ClassName 
  11. end;
  12. end;

Definición de la tabla:



delphi
  1. ZQuery1.SQL.Text := 'CREATE TABLE IF NOT EXISTS "personas" ("nombre" varchar(10) PRIMARY KEY, "edad" integer, "sexo" varchar(6))';

 

Estas complemente seguro de que el campo sexo existe en la tabla? Si muestras la tabla en un dbgrid con select *, se ve el campo sexo?


Sí se ve la columna del campo "sexo", lo que no, porque es obvio, al no poder grabarse, no aparece el
registro ni los campos.
  • 0

#18 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 24 abril 2016 - 12:46

mmm, veamos, coloca un ZQuery2.prepare antes del ExecSQL.

 

Nada enecumene, no admite grabar el registro!


  • 0

#19 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 abril 2016 - 09:01

Acabo de crear un demo y no logro replicar tu problema, coloco los fuentes y revisa detenidamente.

 

Archivo adjunto  dooper.png   8,38KB   0 descargas
 

Saludos.

Archivos adjuntos


  • 0

#20 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 abril 2016 - 11:04

De la última muestra de código observo lo siguiente:

1. Al parámetro edad en lugar de invocar a un .AsInteger (como se esperaría y debe ser) figura un .Integer. Que yo recuerde no existe .Integer ;)

2. Podríamos asumir que tienes bien declarada e implementada la función GetSexoSeleccionado, pero como preguntabas por donde debería figurar la variable global y, de de donde sale la variable "result" ya estoy en dudas. ¿En que form la declaraste? ¿En el propio form en donde se la está usando? ¿En otro? Dependiendo de ello, deberá declararse en Uses la unidad del form y por tanto cabría la posibilidad de que deba invocarse así: ElForm.GetSexoSeleccionado.

 

El que preguntes que es ese result me hace pensar y dudar si tienes los conocimientos para comprender que es una función y que es un procedimiento. Conocimientos indispensables y básicos. Son los pilares en que descansa el paradigma estructurado y por extensión a POO.

 

3. De todas formas, sea de donde sea que estés obteniendo el sexo, al final al parámetro sexo le estás pasando siempre lo mismo: 'hombre'

 

Saludos,


  • 0




IP.Board spam blocked by CleanTalk.