Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Informacion de columna clave insuficiente (https://www.clubdelphi.com/foros/showthread.php?t=66778)

aanil 11-03-2010 18:16:45

Informacion de columna clave insuficiente
 
Hola a todos.

A que se deberá que cuando escribo directamente en el dbGrid un dato, después de escribir el mismo dato en varios registros seguidos sale el siguiente mensaje

" Informacion de columna clave insuficiente o incorrecta; demasiadas filas afectadas por la actualizacion"

Estoy usando una tabla de access

Gracias..

Caral 11-03-2010 22:00:35

Hola
Depende de a que este conectado el dbgrid y de que tipo de datos traiga.
Lo que esta diciendo es que se están modificando registros que por alguna razón no se pueden modificar.
Saludos
PD: También podría ser algo mas, es difícil sin ver el código, por lo menos para mi.

aanil 11-03-2010 22:18:15

Hola Caral

Este es el codigo.

Código Delphi [-]
if radioButton1.Checked = true then
begin
   with datam.Query1 do begin;

close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,A1 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');

open;
edit;

end;
end;

Hago esta consulta que me lista un curso de la clase, el campo A1, es donde voy a escribir P, A o E, ( Presente, Ausente o Excusa). Esto lo hago directamente en la columna A1 del DbGrid, claro que pongo el query en modo edit, luego cuando termino de pasar la asistencia hago un post.

Tiene dos botones:

Editar y Grabar.

Gracias.

Caral 12-03-2010 01:28:50

Hola
Para mi uno de los problemas puede ser el ADD.
No se por que pero aveces también me ha dado problemas por eso trato de no usarlo salvo casos especiales.
El código no parece tener ningún problema, por eso yo usaría Text, por si acaso.
Código Delphi [-]
if radioButton1.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Text:= 'select NOMBRES, MATRICULA, A1 from 20092'+
           'where clave ='+quotedstr(combobox1.Text)+
           'order by NOMBRES asc';
open;
edit;

end;
end;
El único problema que le podría ver es si intentas afectar o modificar alguna parte de la información y no llamas a toda la tabla osea
Código Delphi [-]
if radioButton1.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Text:= 'select * from 20092'+
           'where clave ='+quotedstr(combobox1.Text)+
           'order by NOMBRES asc';
open;
edit;

end;
end;
Si no la llamas así tendrías que hacer un UpDate y modificar los campos.
Recuerda que aun que llames a todos los campos puedes mostrar solo los que desees.
Saludos

aanil 12-03-2010 02:01:14

Hola

Ya encontré el por que del problema:

Sucede que en mi tabla tengo un estudiante que se llama JOSE LUIS FERRER, con matricula 778734 y cursa la asignatura Historia de la Educación I, ese mismo estudiante esta en la misma tabla, pero también cursa otra asignatura con el mismo profesor que se llama Didáctica de las Ciencias Sociales.

Cuando hago la consulta de la asignatura Historia de la Educación I el estudiante aparece en esa lista, y cuando le pongo la letra de presente, el programa no sabe si tambien tiene que actualizar el estudiante en la otra asignatura.

Asi que acomodé el codigo de la siguiente manera, para distinguir en la asignatura y asi dejó de producirme el error.

Antes el codigo era asi:

Código SQL [-]
sql.Add('select NOMBRES,MATRICULA,A1 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');

Ahora le agregué el campo clave asi:

Código SQL [-]
sql.Add('select NOMBRES,MATRICULA,CLAVE,A1 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');

De todas manera tambien voy a probar tu sugerencia, pero no recuerdo como se hace cuando uno quiere que se vean algunos campos en el dbgrid, cuando uno dice SELECT * FROM TABLA, y solo se vean Nombres, Matricula, A1, ya sabes.

Saludos..

Caral 12-03-2010 02:06:45

Hola
El dbgrid esta ligado al datasource que es el que esta ligado al query.
Le das doble click al dbgrid y sale una pantalla, ahi le pones los campos que quieres que se vean.
Saludos

aanil 12-03-2010 02:33:18

Hola Caral.

Eso si lo he hecho muchas veces, lo que pasa es que cuando venga la próxima clase, para pasar la asistencia 2 (A2), lo que he hecho es

Código SQL [-]
Select Nombres, Matricula, Clave, A2 from Tabla.

En la siguiente clase tengo:
Código SQL [-]
Select Nombres, Matricula, Clave, A3 from Tabla.
Y así sucesivamente hasta A10.

Esto con el objetivo de que solo se vea el nombre, la matricula y la asistencia para hacer manualmente la actualización

Por eso no lo quise hacer de la manera que tu me expone.

Si hay otra forma? me lo hace saber.

La que tengo ahora me acomoda bien.

Saludos.

Caral 12-03-2010 02:41:44

Hola
Si algo he aprendido es que con delphi se puede hacer casi todo, eso si, los que saben.:)
Código Delphi [-]
Select Nombres, Matricula, Clave, A2 from Tabla.
Dbgrid.Columns[0].FieldName:= 'Nombres';
Dbgrid.Columns[1].FieldName:= 'Matricula';
Dbgrid.Columns[2].FieldName:= 'Clave';
Dbgrid.Columns[3].FieldName:= 'A2';
No se si funciona, pero por ahi anda la cosa.
Saludos

aanil 12-03-2010 03:01:59

Hola.

Voy a probar eso que me dices:

Esta es la forma como lo tengo

Código Delphi [-]
procedure TForm3.BitBtn4Click(Sender: TObject);
begin

if radioButton1.Checked = true then
begin
   with datam.Query1 do begin;

close;
sql.Clear;

sql.Add('select NOMBRES,MATRICULA,CLAVE,A1 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
end;


if radioButton2.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A2 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;

end;
 end;

if radioButton3.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A3 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
 edit;

end;
 end;

 if radioButton4.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A4 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
 end;

 if radioButton5.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A5 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
 end;

if radioButton6.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A6 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
 end;

if radioButton7.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A7 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
 end;

if radioButton8.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A8 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
 end;

 if radioButton9.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES,MATRICULA,CLAVE,A9 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
 end;

 if radioButton10.Checked = true then
begin
   with datam.Query1 do begin;
close;
sql.Clear;
sql.Add('select NOMBRES, MATRICULA,CLAVE,A10 from 20092');
sql.Add('where clave ='+quotedstr(combobox1.Text));
sql.Add(   'order by nombres asc');
open;
edit;
end;
end;
end;

Y esta funcionando.

Lo que se ve es muy largo, pero eso es lo que tengo.

Saludos..

Caral 12-03-2010 13:16:22

Hola
Sabiendo que la sentencia SQL es string se puede hacer casi cualquier cosa, un ejemplo:
Código Delphi [-]
procedure TForm3.BitBtn4Click(Sender: TObject);
var Texto: String;
begin
 Texto:= 'where clave = '+quotedstr(combobox1.Text)+' order by nombres asc';
 with datam.Query1 do begin;
 close;
 sql.Clear;

if radioButton1.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A1 from 20092'+Texto;
open;
edit;
end;

if radioButton2.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A2 from 20092'+Texto;
open;
edit;
end;

if radioButton3.Checked = true then
begin
sql.Text:='select NOMBRES,MATRICULA,CLAVE,A3 from 20092'+Texto;
open;
edit;
end;

if radioButton4.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A4 from 20092'+Texto;
open;
edit;
end;

if radioButton5.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A5 from 20092'+Texto;
open;
edit;
end;

if radioButton6.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A6 from 20092'+Texto;
open;
edit;
end;

if radioButton7.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A7 from 20092'+Texto;
open;
edit;
end;

if radioButton8.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A8 from 20092'+Texto;
open;
edit;
end;

if radioButton9.Checked = true then
begin
sql.Text:= 'select NOMBRES,MATRICULA,CLAVE,A9 from 20092'+Texto;
open;
edit;
end;

if radioButton10.Checked = true then
begin
sql.Text:= 'select NOMBRES, MATRICULA,CLAVE,A10 from 20092'+Texto;
open;
edit;
end;

end;
De esta manera no se repite el codigo constantemente.
Saludos

aanil 12-03-2010 17:42:20

Gracias Caral

Este código esta mas claro, comodo y bien comprensible.

Gracias..

Caral 12-03-2010 19:20:10

Hola
Recuerda que en tu caso prácticamente todo se repite y que lo que necesitas modificar es solamente el string del SQL, osea, tienes muchas alternativas.
Otra, mas reducida:
Código Delphi [-]
procedure TForm3.BitBtn4Click(Sender: TObject);
var Texto1, Texto2: String;
begin
 Texto1:= 'select NOMBRES,MATRICULA,CLAVE,';
 Texto2:= 'from 20092 where clave = '+quotedstr(combobox1.Text)+' order by nombres asc';
 with datam.Query1 do begin;
 close;
 sql.Clear;

try
if radioButton1.Checked = true then
begin
sql.Text:= Texto1+'A1'+Texto2;
end;

if radioButton2.Checked = true then
begin
sql.Text:= Texto1+'A2'+Texto2;
end;

if radioButton3.Checked = true then
begin
sql.Text:= Texto1+'A3'+Texto2;
end;

if radioButton4.Checked = true then
begin
sql.Text:= Texto1+'A4'+Texto2;
end;

if radioButton5.Checked = true then
begin
sql.Text:= Texto1+'A5'+Texto2;
end;

if radioButton6.Checked = true then
begin
sql.Text:= Texto1+'A6'+Texto2;
end;

if radioButton7.Checked = true then
begin
sql.Text:= Texto1+'A7'+Texto2;
end;

if radioButton8.Checked = true then
begin
sql.Text:= Texto1+'A8'+Texto2;
end;

if radioButton9.Checked = true then
begin
sql.Text:= Texto1+'A9'+Texto2;
end;

if radioButton10.Checked = true then
begin
sql.Text:= Texto1+'A10'+Texto2;
end;

finally
open;
edit;
end;

end;

end.
Y habrán mas opciones, la idea con esto es solamente que aprendamos a dividir un string.
Saludos

Caral 12-03-2010 19:44:55

Hola
Se nota que no tengo nada que hacer jejeje.
Este codigo tal vez te parezca interesante, mira como se reduce todo:
Código Delphi [-]
procedure TForm3.BitBtn4Click(Sender: TObject);
var
Texto1, Texto2: String;
i: Integer;
Comp: TComponent;

begin
 Texto1:= 'select NOMBRES,MATRICULA,CLAVE,A';
 Texto2:= 'from 20092 where clave = '+quotedstr(combobox1.Text)+' order by nombres asc';
 with datam.Query1 do begin;
 close;
 sql.Clear;

 for i := 1 to 10 do begin  // 10 radioButton
 comp := FindComponent('radioButton' + IntToStr(i));

 If TradioButton(comp).Checked = true then
 begin
 sql.Text:= Texto1+IntToStr(i)+Texto2;
 open;
 edit;
 end;

end;
end;
end;
Siempre me acuerdo que el Maestro Neftali fue el que me lo enseño.
Saludos

aanil 13-03-2010 02:14:04

Hola Caral.

El penúltimo código lo copie y pegue y cuando lo corro dice este mensaje de error.

s (falta operador) en la expresion de consulta 'A1from 20092 where clave = 'PED 411-04' orde by nombres asc'.

El ultimo código también presenta un error aun mas grave.

Saludos.

Caral 13-03-2010 04:02:25

Hola
No veo donde esta el error, tal vez sea la separación:
Código Delphi [-]
sql.Text:= Texto1+' A1 '+Texto2;
No se....
Saludos

aanil 13-03-2010 12:44:58

Hola Caral,

El último código que me pasaste cuando lo ejecuto dice:

"Access violation at address 004E0576 in module 'Project1.exe'.
Read of address 00000000."


El antepenúltimo lo voy a observar y ver donde es que tiene el
error de sintaxis.

Luego te digo como me queda.

Saludos..

Caral 13-03-2010 13:45:45

Hola
Todos los códigos los he hecho al aire, sin probarlos.
La idea es que vieras las posibilidades, pero para que funcionen seguro que tienen alguno que otro problema.
Usa el que funcione, los otros los puedes ir viendo y analizando.
Saludos
Pd: Recuerda que de esto no se casi nada, solo pretendo ayudar en lo que pueda, alguna que otra vez me sale bien.

aanil 13-03-2010 17:56:30

Hola

Gracias por esa excelente ayuda, me sirve de estudio y para mi biblioteca de códigos.

Bueno este hilo se puede cerrar, luego seguiré en busca de ayudas.

Y te recuerdo Caral que eres un excelente y entusiasta orientador

Saludos...

Caral 14-03-2010 01:14:17

Hola
Para demostrarme a mi mismo que si se podía utilizar el ultimo código, (El mas pequeño de todos), hice un ejemplo sencillo.
Este ejemplo tiene una BD Access, 1 tabla, 3 radiobuttons, 1 combobox, 1 edit, 1 boton, 1 DBGrid.
Se selecciona la Clave del combobox, (es cargada de la BD).
Se selecciona un RadioButton
Se presiona el boton
En el DBGrid se muestran los datos y el ultimo campo cambia tanto el titulo como la información.
En el edit se podrá ver la sentencia SQL que genera todo este enredo:)
Espero que te sirva de ejemplo, veras que en realidad es muy sencillo de entender.
Saludos

aanil 14-03-2010 22:18:36

Hola Cara:

Esto si esta de maravilla, ya lo adapté a mi trabajo y me quedó perfecto.

Gracias.


La franja horaria es GMT +2. Ahora son las 04:03:17.

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