Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Test de Evaluacion (https://www.clubdelphi.com/foros/showthread.php?t=60394)

Elite237 14-10-2008 21:24:29

Estas son las estructuras de mis tablas:
Código Delphi [-]
----------------'  '------------ '     '--------------- '  '-----------------'
'TEvaluacion      '  ' TSecciones  '     'TPreguntas       '   ' TOpciones        '
----------------'  '------------ '     '---------------  '  '----------------'
'eval_clave        '  'secc_evaluacion'  'preg_evaluacion  ' 'opci_evaluacion  '
'eval_descripcion'  'secc_clave   '      ' preg_secc        '   'opci_secc         '
'eval_tipo          '  'secc_nombre'      'preg_clave         '   'opci_pregunta    '
----------------'  '-------------'      'preg_descripcion '   'opci_clave         '
                                                  -----------------'  'opci_descripcion '
                                                                           opci_valor         '
                                                                         -----------------'

eval_clave de tevaluacion se relaciona con secc_evaluacion de tsecciones
preg_evaluacion de tpreguntas se relacion con eval_clave

secc_clave de tsecciones se relaciona con preg_seccion de tpreguntas
preg_clave de tpreguntas se relaciona con opci_pregunta

opci_seccion se relaciona con preg_Seccion..

Espero darme a entender, todos tienen su campo que las identifica y otro que las une a cada tabla, y entonces queda de a cada evaluacion corresponde una seccion, a cada seccion corresponde una pregunta y a cada pregunta una opcion(respuesta).

Ya empece a hacerlo con el stringgrid, pero no me sale, me dice que no encontro un campo, pero lo raro es que lo especifico en mi select...saludos y gracias por sus comentarios

Delphius 14-10-2008 21:53:56

Ahora entiendo mejor el panorama.
Te estoy preprando un ejemplo sencillo de como hacerlo. Espero que no te moleste que sea con Access.
Dame un tiempo.

Saludos,

Elite237 15-10-2008 03:43:23

No me molesta Delphius, como crees, te lo agradezco muchisimo...yo seguire intentando con el stringgrid, ya que no me arroja las opciones de las preguntas(en el mismo paso donde me quede con los frames:D). Saludos

Delphius 16-10-2008 19:18:25

Hola Elite237,
Disculpa que me haya demorado, pero es que estos día he estado un tanto off-line y se me hace difícil sacar tiempo con tanta interrupciones.

Bueno, aqui está una demo. Muchas cosas se pueden optimizar, la idea era desarrollar algo que pueda ser intuitivo, y fácil de comprender. Espero que la demo te sea de guia.

Quisiera mencionar que la demo está en la carpeta temporal del FTP del club. Si algún moderador considera que no es conveniente localizar allí la demo le agradecería que me lo hiciera saber.

Saludos,

Elite237 16-10-2008 19:30:55

Gracias delphius!!!!:eek:. Tengo el mismo inconveniente de antes, me dice que no encontro un archivo:
Código Delphi [-]
fie not found:variants.dcu

Me imagino que es por que no lo reconoce, ya que uso delphi 5.Como lo corrijo?

Delphius 16-10-2008 19:47:45

Cita:

Empezado por Elite237 (Mensaje 320582)
Gracias delphius!!!!:eek:. Tengo el mismo inconveniente de antes, me dice que no encontro un archivo:
Código Delphi [-]fie not found:variants.dcu


Me imagino que es por que no lo reconoce, ya que uso delphi 5.Como lo corrijo?

Hola Elite237,
La verdad es que no te sabría decir. Yo uso Delphi 6. Desconozco si en D5 existe o no la unidad Variants.
Por lo pronto, fíjate si en la ayuda menciona algo al respecto. De paso, fijate si entre los directorios que conforman la LIBRARY PATH existe el archivo Variants.dcu y/o el archivo Variants.pas

¿El error que te arroja es con el demo que hice?:confused:

Saludos,

Elite237 16-10-2008 19:59:19

Hola que tal, fijate que le elimine eso de variant, y si corre, pero al dar clic al boton de generar el cuestionario me manda el siguiente error:

Código Delphi [-]
El valor de BOF o EOF es True, o el actual registro se elimino;la operacion solicitada requiere un registro actual

Otra preguntota, como puedo hacer para guardar los valores del radiobutton, se como se asigna, pero mi problema es que los radiobutton los genero con un query de acuerdo a la pregunta, y pueden ser 2,3 ó 4 respuestas que tenga cada una.Esto lo quiero hacer para despues generar una grafica de acuerdo a la suma de las respuestas por seccion.Gracias por tu tiempo Delphius

Delphius 16-10-2008 20:30:00

Cita:

Empezado por Elite237 (Mensaje 320591)
Hola que tal, fijate que le elimine eso de variant, y si corre, pero al dar clic al boton de generar el cuestionario me manda el siguiente error:

Código Delphi [-]El valor de BOF o EOF es True, o el actual registro se elimino;la operacion solicitada requiere un registro actual


Otra preguntota, como puedo hacer para guardar los valores del radiobutton, se como se asigna, pero mi problema es que los radiobutton los genero con un query de acuerdo a la pregunta, y pueden ser 2,3 ó 4 respuestas que tenga cada una.Esto lo quiero hacer para despues generar una grafica de acuerdo a la suma de las respuestas por seccion.Gracias por tu tiempo Delphius

Me sigue extrañando eso del Variant.:confused::o
¿Cómo que lo eliminaste? ¿Dónde que apareció? ¿De donde lo borraste?

Ese error que te dió, ¿tiene algún código o número?. Si pudieras explicar paso a paso que hiciste sería muy útil para comprender y reproducir los errores. Tal vez de este modo podríamos saber donde está el problema.

Con respecto a tu pregunta de como guardar los valores, ¿te refieres a guardar en una tabla? ¿A que te refieres con asignar? ¿Asignar que a que?:confused:

Primeramente, antes de seguir avanzando ¿Entiendes al menos el código del demo?
La verdad es que no termino de comprender donde está el problema de guardar el valor o la opción que escoge el usuario.

Veamos, se muestra un form al usuario con las opciones, el escoge una y ¿la duda real aquí cual es? ¿Saber asociar esa opción con el valor correspondiente en la tabla?:confused:

Estudia el demo que te hice llegar, y luego en base a ello, y lo que tienes ordena tus ideas y describe lo mejor posible tus dudas aqui.

No te vamos a cobrar por las palabras, ordena bien tus ideas e inquietudes y en base a ello te podremos seguir asistiendo. Cualquier modificación que haces en tu código sería útil que nos los comentases. De otro modo seguiremos jugando al teléfono descompuesto, y eso nos perjudica a todos.

Saludos,

Elite237 16-10-2008 20:54:41

Cita:

Empezado por Delphius (Mensaje 320595)
Me sigue extrañando eso del Variant.:confused::o
¿Cómo que lo eliminaste? ¿Dónde que apareció? ¿De donde lo borraste?

Ese error que te dió, ¿tiene algún código o número?. Si pudieras explicar paso a paso que hiciste sería muy útil para comprender y reproducir los errores. Tal vez de este modo podríamos saber donde está el problema.

Aparecio en la declaracion del uses, alli me lo marcaba en rojo y con el cursor parpadeando, lo que hize fue borrarlo y de ahi lo ejecute (F9)y despues me aparecio un error que me indicaba que la base de datos deberia ser local, por lo que trate de corregirlo checando en la propiedad connectionstrign del adoconnection asegurando que la base de datos fuera la de access que hiciste y despues de haberlo hecho lo volvi a ejecutar y me salio el error que te

Elite237 16-10-2008 20:58:47

que te escribi hace rato.
Código Delphi [-]
El valor de BOF o EOF es True, o el actual registro se elimino;la operacion solictada requiere un registro actual

Perdon es que no habia terminado la frase.

Elite237 16-10-2008 21:57:57

Cita:

Empezado por Delphius (Mensaje 320595)
La verdad es que no termino de comprender donde está el problema de guardar el valor o la opción que escoge el usuario.

Veamos, se muestra un form al usuario con las opciones, el escoge una y ¿la duda real aquí cual es? ¿Saber asociar esa opción con el valor correspondiente en la tabla?:confused:

Como tu lo dices mi estimado Delphius,se muestra el form al usuario con las opciones,el escoge una y esa respuesta con el valor que le corresponde, que se guarde en una tabla (tresultados)que acabo de crear. La estructura de mi tabla es :

RESU_FECHA...RESU_PREGUNTA....RESU_SECCION...RESU_OPCION.....RESU_VALOR
RESU_USUARIO....RESU_EVALUACION

Esto es para que haga un historial de todas las personas que presentaron el cuestionario,junto con las respuestas y las opciones que escogieron.Para despues graficar los resultados
--------------------------------------------------------------------
Ahora veo que en tu codigo tienes una parte donde me imagino relacionas las opciones que elige el usuario en cada pregunta.Tienes el siguiente codigo:
Código Delphi [-]
// 2. Asociamos a la pregunta el resultado elegido con el formato IDPregunta: Valor
  sgCuestionario.Cells[Seccion, Pregunta] := Format(res_resultado,[IDPregunta,Valor]);

Estoy bien?
Si es asi, entonces como lo guardarias en la tabla?

Delphius 17-10-2008 02:44:55

¿Cómo los guardaría?
Con una instrucción SELECT. Suponiendo que se trata de ADO...

Algo así:

Código Delphi [-]
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO tabla (campo1, campo2, ..., campoN)');
Query1.SQL.Add('VALUES (:parametro1, :parametro2, ... :parametroN');

Query1.Parameters.ParamByName('parametro1').Value := ....
Query1.Parameters.ParamByName('parametro1').Datatype := ft.....
....
Query1.Parameters.ParamByName('parametroN').Value := ....
Query1.Parameters.ParamByName('parametroN').Datatype := ft.....
Query1.ExecSQL;

El asunto es que no interesan donde mantengas "guardados" los datos en forma temporal hasta meterlos en la tabla, puede ser en una Celda de un TStringList, en un TLabel, un TEdit, una variable, en una posición de algún vector, ... lo importante es que los parámetros sean del tipo correcto (DataType) y que respetemos el orden en como asignemos los valores que asumirán los parámetros. Es decir que si en el SQL pusimos primero A, B y C, en values deben seguir el mismo orden orden: A, B y C.

Esta instrucción INSERT es una de las formas en como se puede declarar, y se puede (o debe mejor dicho) emplear cuando no necesariamente se ingresan todos los campos o los campos a mencionar no están en el mismo orden en que están declarados en la tabla.

En el caso de que se asume que todos los datos se van a suministrar, podemos evitarnos nombrar los campos. Pero he aquí que la instrucción SQL debe ser de esta forma:

Código SQL [-]
INSERT INTO tabla VALUES (....)

Y aquí, necesariamente (y obligadamente) debemos respetar el orden de los campos en la tabla al pasar los valores en la parte "VALUES".

No se si me explico, espero que se entienda la idea. Si tienes dudas, ya nos dirás.

Saludos,

Elite237 17-10-2008 03:06:21

Tienes razon delphius..fijate que lo que hize ahora fue esto, antes de empezar a guardarlo en una tabla como tu decias, mejor lo dejo en una celda y al final lo guardo.Lo que hize fue que apareciera en una celda los valores que selecciono en cada pregunta, de la siguiente manera

Código Delphi [-]
Asi esta mi StringGrid
---------'-----------'-------------'
No.Preg  '   Pregunta ' Resultado    '
-------- '----------- '------------ '
y en la columna resultado aparece el valor de la respuesta que selecciono.Mejor no?

Ahora, mi duda es como sumo todas los valores que hay en las celdas de la columna resultado?

Delphius 17-10-2008 03:23:02

Si te es "viable", tranquilamente puedes mantener una variable que se vaya incrementando en la proporción al resultado. Puede calcularse a medida que uno va respondiendo. Por ejemplo, antes de que "guardes" el valor en el TStringGrid puedes hacer dicha suma, ¿o es que no tienes los datos?;)

Dije al inicio "viable". Esto lo digo porque habría que analizar mejor el panorama y no siempre es posible o adecuado ir almacenando dicha suma. Supongamos que el usuario tiene la opción de corregir su respuesta: en este escenario necesitaríamos corregir el resultado y por consiguiente hacer las sumas y restas necesarias. La opción aquí, podría pasar por recorrer dicha columna al final del cuestionario. Algo así:

Código Delphi [-]
for i := 1 to Cuestionario.RowCount - 1 do // 1 es la fila donde inicia la cuenta
  suma := suma + StrToInt(Cuestionario.Cells[pos_columna_resultado,i]);

Saludos,

Elite237 17-10-2008 03:41:00

Cita:

Empezado por Delphius (Mensaje 320671)
Supongamos que el usuario tiene la opción de corregir su respuesta: en este escenario necesitaríamos corregir el resultado y por consiguiente hacer las sumas y restas necesarias.

Segun yo, no pueden cambiar las respuestas, pero no habia pensado en si se equivocan.Un muy buen punto delphius

Código Delphi [-]
 
suma := suma + StrToInt(Cuestionario.Cells[pos_columna_resultado,i]);
La variable suma la declaras como cadena??
En la parte de pos_columna_resultado no entiendo como aplicarlo

Delphius 17-10-2008 03:50:31

suma es de tipo integer. Si te fijas, para sumar apropiadamente hago una conversión de string a integer (StrToInt).

pos_columna_resultado hace referencia a la columna del TStringGrid en donde se guarda el resultado.
Lo que hace el algoritmo es irse moviendo fila a fila sobre la columna resultado y sumando el valor. No tiene demasiada magia.

Saludos,

Elite237 17-10-2008 04:09:54

ok...ok..en que evento coloco ese codigo??

Una duda.....despues de que haya terminado de contestar y tenga que guardarlo, lo hago como me sugeriste??con el query??para insertar los datos en mi tabla.Gracias

Delphius 17-10-2008 05:32:22

Hola Elite237, se me había caído la conexión.
Bueno, a ese código lo deberías ejecutar en donde te sea conveniente. Por otro lado no veo otra forma de guardar los datos en la tabla sin emplear esa consulta SQL (1)

(1) Hay otra opción, pero no es tan económica comparada con el uso de un TQuery: TTables.

La alternativa al empleo de estar guardando los datos en variables temporales, o StringsGrids, etc es tener una tabla temporal y luego pasar de esta tabla temporal a la definitiva. Bastaría con un INSERT para volcar los datos desde la tabla temporal a la otra:

Código SQL [-]
INSERT INTO tabla
(SELECT * FROM tabla_temporal)

Disculpame que sea entrometido, ¿cuándo debes presentar el sistema?
Viendo como se fue desarrollando el hilo, te recomiendo una lectura sobre SQL. No es por ser atrevido pero necesitas reforzar algunos conceptos y manejos sobre bases de datos.

Saludos,

Elite237 17-10-2008 16:04:32

Gracias por los comentarios, el sistema lo debo de entregar para ayer..jajajja, bueno me estan esperando para poder implementarlo. Por otro lado, seguire leyendo de SQL para aprender mas. En otros post te preguntaba como guardarlo, ¿por que?por que yo lo hago con ttables y vi que tu lo haces con querys, yo no lo habia intentado asi. Apenas ahora estoy usando stringgrid, y he aprendido algunas cosillas, pero no del todo, por eso les pregunto a ustedes que saben mas que yo.Aqui seguire intentando que quede bien el sistema..de hecho estoy casi 12 horas en la lap leyendo e intentando de todo.Saludos Delphius

Elite237 01-11-2008 18:57:28

Mostrar Panel en evento onDblClic del StringGrid
 
Hola, recuerdan que habia posteado una ayuda con referencia a este evento, pues bien, lo pude solucionar y logre que se mostraran todas las respuestas de una pregunta en un panel al momento de hacer doble clic en la pregunta que se mostraba en el StringGrid. Pero ahora me cambiaron las estructuras de mis tablas y no puedo mostrar las respuestas.Asi quedo mi tabla, donde se almacena tanto las secciones,las preguntas y las opciones:

Código Delphi [-]
Det_evaluacion
 
det_eval          (la clave de la evaluacion)
det_version      (la version de la evaluacion)
det_clave        (la clave ya sea para seccion(1...y asi sucesivamente),pregunta(1.1..1.2..1.3) y opciones(1.1.1...1.1.2)
det_pregunta   (descripcion de la seccion,pregunta u opcion)
det_tipo          (aqui se diferencia si es seccion(el valor es 0),pregunta(el valor es 1) u opcion(el valor es 2)
det_valor         (valor que tendran, si es seccion(0),si es pregunta(0), si es opcion(los valores seran de 1 a 5)

Este es el codigo que tengo ahora en el evento y nose muestran las respuestas en el panel:
Código Delphi [-]
procedure TForm1.sgEvaluacionDblClick(Sender: TObject);
var
evalua,saca:string;
i:integer;
begin
  if sgEvaluacion.col=1 then
   begin
    //Obtenemos la clave de la evaluacion del combobox
    evalua:=copy(cmbEvaluacion.text,0,pos('-',cmbEvaluacion.text)-1);
    //Obtenemos la clave de la pregunta del Stringgrid
    saca:=sgEvaluacion.cells[sgEvaluacion.col-1,sgEvaluacion.row];
    query3.close;
    query3.sql.clear;
    query3.sql.Add('select det_eval,det_clave,det_pregunta,det_valor,det_tipo from det_evaluacion');
    query3.sql.add('where det_eval = '''+evalua+'''');
    query3.sql.add('and   det_tipo= 2');

    //si omito esto,aparecen todas las respuestas de todas las secciones en el panel
    query3.sql.add('and det_clave = '''+saca+'''');

    abre(query3);
    rgRespuestas.items.clear;
    while not query3.Eof do
     Begin
      rgRespuestas.Items.Add(query3.FieldByName('det_valor').asstring+'-'+query3.FieldByName('det_pregunta').asstring);
      query3.Next;
     End;
     panel1.visible:=true;
     rgRespuestas.ItemIndex:=0;
   End
   else
    showmessage('No hay opciones para esta pregunta!');
end;

Gracias por su ayuda


La franja horaria es GMT +2. Ahora son las 10:52:23.

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