Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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..
Responder Con Cita
  #2  
Antiguo 11-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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.
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 11-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 12-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 12-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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..
Responder Con Cita
  #6  
Antiguo 12-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #7  
Antiguo 12-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 12-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #9  
Antiguo 12-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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..
Responder Con Cita
  #10  
Antiguo 12-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #11  
Antiguo 12-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
Gracias Caral

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

Gracias..
Responder Con Cita
  #12  
Antiguo 12-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #13  
Antiguo 12-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #14  
Antiguo 13-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 13-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No veo donde esta el error, tal vez sea la separación:
Código Delphi [-]
sql.Text:= Texto1+' A1 '+Texto2;
No se....
Saludos
__________________
Siempre Novato
Responder Con Cita
  #16  
Antiguo 13-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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..
Responder Con Cita
  #17  
Antiguo 13-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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.
__________________
Siempre Novato
Responder Con Cita
  #18  
Antiguo 13-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
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...
Responder Con Cita
  #19  
Antiguo 14-03-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato

Última edición por Caral fecha: 15-03-2010 a las 16:59:52.
Responder Con Cita
  #20  
Antiguo 14-03-2010
aanil aanil is offline
Miembro
 
Registrado: abr 2006
Posts: 155
Poder: 19
aanil Va por buen camino
Hola Cara:

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

Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Hacer que una columna de un DbGrid aparezca distinta según valor Aprendiendo OOP 11 30-11-2018 14:47:20
error de sql server "Informacion de columna clave insuficiente" jhcaboverde Conexión con bases de datos 1 17-08-2007 19:40:31
Informacion de columna clave insuficiente para realizar la operacion update o refresh Cabanyaler MS SQL Server 11 04-06-2007 13:25:04
informacion de columna clave insuficiente vipernet MS SQL Server 6 07-09-2006 20:26:40
Extraer datos de una pagina en java que tiene clave (sabiendo la clave claro) ;) kalimocho Internet 2 29-06-2005 05:11:24


La franja horaria es GMT +2. Ahora son las 10:08:06.


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
Copyright 1996-2007 Club Delphi