PDA

Ver la Versión Completa : de listbox a tabla


donpedro
05-04-2012, 08:48:15
hola, estoy realizando un sistema para colegios y tengo un modulo donde asigno las materias a cada grado. tengo un edit que me acepta el codigo del grado que voy a utilizar, y tengo un listbox1 con todas las materias que estan registradas. tengo otro listbox2 donde voy a pasar las materias del listbox1 que ese grado va a utilizar. ejemplo:
https://lh6.googleusercontent.com/-QkyREqlqqWA/T30-fH7kz_I/AAAAAAAAACw/_g-6jU9edY0/s912/pantalla.jpg

lo que deseo es grabar los datos del listbox2 en una tabla obteniendo el codigo del grado y grabarlo que que quede por ejemplo:

materiaid ! descripcion
-----------!-----------------
5 ! ciencias naturales
5 ! ciencias sociales
5 ! conducta
5 ! educ. artistica

estoy usando el siguiente codigo pero no me funciona:::
procedure TForm1.Button1Click(Sender: TObject);
var a:integer;
begin
dmdatos.ATMATERIAS.Append;
for a := 0 to listbox2.count -1 do
dmdatos.ATMATERIASMATERIAID.AsString:=edit1.Text;
dmdatos.ATMATERIASDESCRIPCION.AsString:=listbox2.Items.Text;
dmdatos.ATMATERIAS.Post;

necesito ver sus opiniones,,, espero que me hallan entendido,,, y gracias....

newtron
05-04-2012, 09:08:12
Hola, no dices qué problema es el que te da pero en principio deberías de cambiar el "append" de sitio y ponerlo debajo del "for".

Saludos

donpedro
05-04-2012, 09:11:39
hola newtron, el problema es que solamente me graba el primer items del listbox, y lo que quiero es que grabe el primero luego siga con los demas agregandole a cada uno el codigo del grado que esta en el edit.

jafera
05-04-2012, 09:51:15
Hola, prueba así

procedure TForm1.Button1Click(Sender: TObject);var a:integer;
begin
for a := 0 to listbox2.count -1 do
begin
dmdatos.ATMATERIAS.Append; // cambia de posición tal como dice newtron
dmdatos.ATMATERIASMATERIAID.AsString:=edit1.Text;
dmdatos.ATMATERIASDESCRIPCION.AsString:=listbox2.Items.Text;
dmdatos.ATMATERIAS.Post;
dmdatos.ATMATERIAS.Next; // añade
end;

Saludos

donpedro
05-04-2012, 09:57:07
hola jafera, le hice los cambios pero aun asi solo me graba el primer item del listbox,, parece que el for no lo esta recorriendo

jafera
05-04-2012, 10:26:14
Perdón, habia cogido el código de un uso mio que lo hago desde una tabla, tu lo que tienes que hacer es un next al item del listbox2

listsbox2.Items.Next;

procedure TForm1.Button1Click(Sender: TObject);var a:integer;
begin
for a := 0 to listbox2.count -1 do
begin
dmdatos.ATMATERIAS.Append; // cambia de posición tal como dice newtron
dmdatos.ATMATERIASMATERIAID.AsString:=edit1.Text;
dmdatos.ATMATERIASDESCRIPCION.AsString:=listbox2.Items.Text;
dmdatos.ATMATERIAS.Post;
listbox2.Items.Next; // añade
dmdatos.ATMATERIAS.Next; // quita
end;


A ver así

Saludos

donpedro
05-04-2012, 10:32:15
da error en la linea:
listbox2.items.next;

creo que el next no se utiliza en el listbox

jafera
05-04-2012, 10:50:14
No se, puedes probar con ItemIdex.

listbox2.ItemIndex(a);


Mira en la ayuda de Delphi (yo lo estoy haciendo)

Josep

MartinS
05-04-2012, 11:57:14
Hola: debes indicarle el numero de indice del ListBox.

for a := 0 to listbox2.count -1 do
begin
dmdatos.ATMATERIAS.Append; // cambia de posición tal como dice newtron
dmdatos.ATMATERIASMATERIAID.AsString:=edit1.Text;
dmdatos.ATMATERIASDESCRIPCION.AsString:= listbox2.Items.Strings[a]; // El "a" te esta dando el indice de la lista
dmdatos.ATMATERIAS.Post;
end;

Nada mas que eso. Del bucle se encarga el for.

Saludos

Caro
05-04-2012, 15:03:49
Hola, debes hacerlo como te indica MartinS, solo añadiendo, también puedes acceder al Item del ListBox de esta forma:

dmdatos.ATMATERIASDESCRIPCION.AsString:= listbox2.Items[a];
//y puedes utilizar With
for a := 0 to listbox2.count -1 do
begin
With dmdatos do
begin
ATMATERIAS.Append;
ATMATERIASMATERIAID.AsString:=edit1.Text;
ATMATERIASDESCRIPCION.AsString:= listbox2.Items[a];
ATMATERIAS.Post;
begin
end;


Saluditos

donpedro
05-04-2012, 22:37:54
muchas gracias martinS, y caro.... funciona a la perfeccion.. ahora estoy tratando de hacer: por ejemplo: si le asigno 5 materias a un grado y grabo,, pero se me olvido agregar otra.. como hago para que solo me grabe la nueva que voy a incluir. no se si me di a entender....
lo que estoy tratando es de crear un boton que me modifique la tabla utilizando el siguiente codigo:

//esto va dentro del boton modificar
with dmdatos do
begin
atmaterias.Locate('materiaid',edit1.Text,[]);
atmaterias.Edit;
end;


entonces en el boton grabar comparo si la tabla esta en insert o en edit,,, pero el programa explota y dice que no se ha podido encontrar el hilo.

lo que quiero es que la que ya estan grabadas me las deje intacta y que solo grabe la nueva que se incluyo.

como me pueden ayudar..gracias

MartinS
06-04-2012, 00:58:53
Hola donpedro: Antes que nada no se que tipo de base de datos estas usando y mucho menos su estructura. Ahora bien, en algun lugar lei que ya estas cerca de finalizar tus estudios de informatica por lo tanto "solo expondre" la idea de lo que YO haria:

1.- Usaria una ventana similar a la carga de datos pero lo que deberias hacer es levantar del curso las materias y colocarlas en el listbox

MateriasDeCurso.First
While not MateriasDeCurso.Eof do
Begin
If campoCodigoMateriaDeCurso = BuscadoPorEdit then
Begin
ListBox2.items.Add(MateriaCodigoyDetalle);
end;
MateriasDeCurso.Next;
end;

2.- Hace las incorporaciones nuevas y van a ir agregandose al final del listbox2
3.- Grabar... Pero no tan facil :p
Debes recorrer el listbox y fijarte cual es la que agregaste, si quieres puedes usar el metodo locate de modo que si lo encuentra pasa al siguiente elemento del listbox y si no lo graba.-

Ahh! el locate puede dar un valor booleano, es decir puedes usarlo así:

If Not MateriasDeCurso.Locate(LoQueBuscas) then
GraboNuevo
else
SiguienteDeLaLista

Nuevamente: Estoy dando ideas a ciegas, No conozco ni la base ni la estructura y puede ser que tambien debas hacer muchas mas comprobaciones antes de guardar, por ejemplo si cambia las materias ya guardadas o le cambian el nombre, etc. etc...
En definitiva y tal vez sea demasiado bruto pero hay que hacer muchas cosas en papel (Analisis, posibilidades, diagramas) antes de escribir el codigo, algo que seguramente tu ya lo sabes ;):D

Bueno cualquier cosa estamos aquí.

Saludos.-

ecfisa
06-04-2012, 01:02:25
Hola donpedro.

Si no entendí mal tu consulta, no sería una modificación, en realidad es agregar un nuevo dato que corresponde a determinado curso.
En ListBox2 se van añadiendo las materias correspondientes al curso, por lo que antes de guardar el nuevo dato agregado, este deberá encontrarse en la última posición de este componente.

Entonces creo que tendrías que hacer:

procedure TForm1.btnModificarClick(Sender: TObject);
begin
ATMATERIAS.Append;
ATMATERIASMATERIAID.AsString:= Edit1.Text;
ATMATERIASDESCRIPCION.AsString:= ListBox2.Items[ListBox2.Items.Count-1];
ATMATERIAS.Post;
end;


Saludos.

donpedro
06-04-2012, 01:11:48
muchas gracias martinS, pido excusa por no especificar la base de datos,, estoy utilizando mysql.....estare probando tu logica,,, luego compartire el resultado...

MartinS
06-04-2012, 01:17:10
muchas gracias martinS, pido excusa por no especificar la base de datos,, estoy utilizando mysql.....estare probando tu logica,,, luego compartire el resultado...

Si, eso queremos, los resultados... :D:D... y si no sale!?, volveremos ;)

Saludos.-

donpedro
06-04-2012, 02:01:50
Si, eso queremos, los resultados... :D:D... y si no sale!?, volveremos ;)

Saludos.-

esta resuelto, gracias martinS, hice una prueba y funciono con tu logica, ahora lo que voy hacer es cargar las materias ya grabadas al listbox....comparto el codigo que verifica si la materia esta registrada y si no esta la graba... para lo que dijiste sobre si eliminan una materia o cambian el nombre de una,, creare unos controles para eso.. no se si utilizar triggers pero ya ver lo que hare.. de todos modos gracias..... comparto el codigo:
procedure TForm1.Button3Click(Sender: TObject);
var x:integer;
begin
with dmdatos do
begin
for x := 0 to Listbox2.Count - 1 do

if not atmaterias.Locate('descripcion',listbox2.Items.Strings[x],[]) then
begin
ATMATERIAS.Append;
ATMATERIASMATERIAID.AsString:=edit1.Text;
ATMATERIASDESCRIPCION.AsString:=listbox2.Items[x];
atmaterias.Post;
end;
end;
end;

donpedro
09-04-2012, 20:23:28
hola de nuevo, estoy mejorando la pantalla y estoy frenado en algo: en la nueva pantalla estoy utilizando un dbgrid y un listbox (con base de datos mysql). estoy pasando registros de un dbgrid al listbox como se muestra en la siguiente figura.
https://lh3.googleusercontent.com/-cLowGV-8i2Y/T4MnIP3XL0I/AAAAAAAAADA/RsFzintkD2A/w500-h250-k/Sin%2Bt%25C3%25ADtulo.jpg

lo que quiero es que cuando mueva una materia del dbgrid al listbox dicha materia se quite del dbgrid. me explico,, si por ejemplo muevo la materia matematica que se compare si algun registro del dbgrid es igual a los del listbox y si es asi que lo quite del dbgrid para asi poder ver las materias que no he agregado... espero que hallan entendido. trate con el siguiente codigo el cual esta en el mismo boton donde muevo los items.
procedure TFASIGPORGRADOS.BitBtn11Click(Sender: TObject);
VAR A:INTEGER;
begin



LISTBOX1.Items.Add(DMDATOS.AQMATERIASDESCRIPCION.AsString);//con este linea muevo del dbgrid al listbox

//aqui quiero comparar los registros del dbgrid con los del listbox
for A := 0 to ListBOX1.ITEMS.Count - 1 do
BEGIN
WITH DMDATOS DO
BEGIN
AQMATERIAS.Active:=FALSE;
AQMATERIAS.Close;
AQMATERIAS.SQL.Clear;
AQMATERIAS.SQL.Add('SELECT * FROM MATERIA WHERE DESCRIPCION NOT LIKE'+''''+'%'+LISTBOX1.Items.Strings[A]+'%'+'''');
AQMATERIAS.ExecSQL;
AQMATERIAS.ACTIVE:=TRUE;

END;

END;

end;


cuando ejecuto ese codigo y selecciono por ejemplo matematica y lo paso al listbox dicha materia se quita del dbgrid, pero si elijo otra por ejemplo lengua española se me agrega al listbox se me borra del dbgrid pero matematica vuelve y aparece en el dbgrid..

espero que me hallan entendido,, espero respuesta y muchas gracias de antemano...

MartinS
10-04-2012, 04:16:54
Hola donpedro: creo que te entendi sobre lo que apuntas pero vas a tener varios inconvenientes a la hora de hacer el pase de materias.-

En primer lugar la consulta pareciera que funcionara pero para que pueda ir quitando las materias del dbgrid debes ir agregando condiciones al where del sql y ciertamente se puede volver bastante engorroso. Calcula que si hace... (Como se dice en Argentina "A la criolla")

1 listar todas las materias
Seleccionaste despues matematica, entonces
2 listar todas las materias, salvo matematicas (anda joya)
despues seleccionas geografia, entonces
3 listar todas las materias, salvo matematicas y salvo geografia y asi sucesivamente vas a tener una consulta bastante grande y que no seria de gran utilidad; mas aun si el cliente decide eliminar una de ellas de las ya asignadas entonces deberias "ubicar" cual es la condicion afectada en el SQL :eek:

Creo que debes volcar todas las materias a un listbox y no a un dbgrid y de ahi hacer el pase para el otro listbox como ya has expuesto
en mensajes anteriores

Otra idea podria ser que al momento de dar de alta nuevas materias primero pongas las materias del curso en el listbox2 que ya habias guardado y despues a hace una consulta de las materias generales e incorporalas al listbox1 pero solo las que no aparecen en el listbox2 asi:

Consulta.First;
While Not Consulta.Eof do
Begin
If ListBox2.Items.IndexOf(ConsultaValor) = -1 then // Si es -1 el items es porque no esta en las materias ya cargadas al curso
ListBox1.Items.Add(ConsultaValor)
Consulta.Next;
End;

El mismo tipo de comprobacion lo puedes hacer cuando pasas las materias de un lado al otro si no borras el origen, si no, primero has el pase
Listbox2.Items.Add(ListBox1.Items[ListBox1.ItemIndex])

y despues borras el origen

ListBox1.Items.Delete(ListBox1.ItemIndex)

Dicho esto creo que es la mejor manera de manejar el pase de materias (Puede no ser la unica forma).-

Ah!! Usa para otra pregunta (como la que hiciste) un nuevo hilo así no confundimos las respuestas y tus dudas saltan al primer lugar de la lista de post aumentando las posibilidades de que alguien que la tenga mas clara (que por cierto hay muchos) conteste y te de una mano. ;)

Saludos.- :D

donpedro
10-04-2012, 15:40:59
pense, que si voy a tratar del mismo tema, no podria crear un nuevo hilo......gracias de todos modos voy a cambiar el dbgrid por un listbox......

Casimiro Notevi
10-04-2012, 15:44:37
pense, que si voy a tratar del mismo tema, no podria crear un nuevo hilo......gracias de todos modos voy a cambiar el dbgrid por un listbox......

Si es el mismo tema, el mismo asunto, que todavía no lo has solucionado, entonces sigue en este hilo.
Si es algo diferente, distinto, entonces hilo nuevo.

donpedro
13-04-2012, 15:59:44
hola a todos, volviendo al tema... agregue los listbox1 y listbox2 donde en el listbox2 cargo todas las materias y en el listbox1 asigno las materias que va a utilizar un grado o un curso. anteriormente como materia asignada estaba guardando en la tabla el nombre de la materia, pero se daba el caso como comento martinS, que si se cambiaba o modificaba una materia esta no se iba a modificar en la tabla de materias asignadas. por tal motivo decidi en vez de guardar el nombre de la materia, guardar el id de la materia.
https://lh4.googleusercontent.com/-yfJsLziUeHU/T4gvFea93iI/AAAAAAAAADk/_BdBpNcA7M8/s902/asigporgrados.jpg

antes cuando grababa el nombre de la materia podia utilizar este codigo para comparar las materias de la tabla materias que no estan en la tabla materias asignadas y asi cuando le de a grabar solo me guarde la materia que no esta.

with dmdatos do
begin
if not aqmaterias.locate('descripcion',listbox1.items.strings[x],[]) then
...
...
end;


pero ahora al guardar el id de la materia tengo que hacer consultas para saber que materia es,y luego cuando incluya otra materia saber que id tiene para comparar ese id y ver si no se encuentra en materias asignadas para poder grabarla lo que pido es que me ayuden a realizar esas consultas,, he intentado pero no me ha dado resultado.... espero haberme explicado.....

muchos preguntaran porque grabar el id,,, bueno si hago algun cambio en una de las materias en la otra tabla cuando seleccione la materia por medio del id va a salir actualizada............

gracias de antemano

donpedro
16-04-2012, 14:46:17
hola a todos, volviendo al tema... agregue los listbox1 y listbox2 donde en el listbox2 cargo todas las materias y en el listbox1 asigno las materias que va a utilizar un grado o un curso. anteriormente como materia asignada estaba guardando en la tabla el nombre de la materia, pero se daba el caso como comento martinS, que si se cambiaba o modificaba una materia esta no se iba a modificar en la tabla de materias asignadas. por tal motivo decidi en vez de guardar el nombre de la materia, guardar el id de la materia.
https://lh4.googleusercontent.com/-yfJsLziUeHU/T4gvFea93iI/AAAAAAAAADk/_BdBpNcA7M8/s902/asigporgrados.jpg

antes cuando grababa el nombre de la materia podia utilizar este codigo para comparar las materias de la tabla materias que no estan en la tabla materias asignadas y asi cuando le de a grabar solo me guarde la materia que no esta.
with dmdatos do
begin
if not aqmaterias.locate('descripcion',listbox1.items.strings[x],[]) then
...
...
end;
pero ahora al guardar el id de la materia tengo que hacer consultas para saber que materia es,y luego cuando incluya otra materia saber que id tiene para comparar ese id y ver si no se encuentra en materias asignadas para poder grabarla lo que pido es que me ayuden a realizar esas consultas,, he intentado pero no me ha dado resultado.... espero haberme explicado.....

muchos preguntaran porque grabar el id,,, bueno si hago algun cambio en una de las materias en la otra tabla cuando seleccione la materia por medio del id va a salir actualizada............

gracias de antemano

Casimiro Notevi
16-04-2012, 16:04:38
Por favor, cumple con nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), no crees otro hilo para continuar este mismo, gracias.
He pegado el otro mensaje a este, además veo que es lo mismo, que lo has copiado.
Y el título descriptivo también es muy descriptivo: 'consultas' :confused:
Gracias por tu colaboración.