Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Insertar Datos con un ciclo repetitivo

Buenas a todos.

Tengo el siguiente problema estoy trabajando con 3 tablas (clientes, productos, cargosfijos) de las cuales en una tengo que ingresar los datos de las otras 2, la verdad eso no me preocupa mucho porque casi todos los datos no cambian y lo puedo hacer desde el código o procedimiento con variables fijas.

El unico campo de las tablas que varia es el del coidgo de clientes entonces yo tengo que llenar todas las filas de la tabla cargosfijos segun la cantidad de clientes que tenga el sistema, es cuando supongo que entra el while en acción el detalle es que no logro colocar la condicion de manera que me funcione y haga el recorrido las cantidades de veces necesarias.

Gracias
Responder Con Cita
  #2  
Antiguo 03-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hola, aclara lo que quieres, hacer, tablas, campos, código, etc. porque lo que dices es algo muy genérico.
Responder Con Cita
  #3  
Antiguo 03-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Lo quiero es ingresar datos en la fila de campos de la tabla scargosfijos validando de la tabla cliente las veces que va hacer dicha inserción es decir si la tabla sclientes cuenta con 4mil clientes me debe ingresar 4 mil lineas en la tabla scargosfijos con el código de cada cliente.

Espero haberme explicado mejor

disculpen
Responder Con Cita
  #4  
Antiguo 03-11-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
podrias preguntar por el eof (end of file o Fin de archivo)


Código Delphi [-]
 
TablaClientes.First;
While Not TablaClientes.Eof Do
begin
..
.. Instrucciones
end
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 03-11-2011
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Si es en tablas planas no hay nada que hacer sino crear métodos para hacer este tipo de operaciones, pero no es nada recomendable, así que mejor usa un motor de bases de datos relacionales, eso es lo que necesitas.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #6  
Antiguo 04-11-2011
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Usa un query lo siguiente:
Código Delphi [-]
begin
  query.sql.text := 'insert into scargosfijos(codigoCliente) values (select codigoCliente from Clientes)'
  query.ExecSql;
end;

He supuesto que tu tabla Clientes tiene un campo llamado codigoCliente y que en tu tabla scargosfijos tambien tiene otro campo llamado igual para almacenar dicho código.

Puesto que no dices los demás campos que hay en las tablas, pues paso del tema y no digo nada más, pero se podrían añadir valores a la tabla scargosfijos.

Por cierto, la próxima vez que quieras hacer algo sobre tablas, por fa, dinos como se llaman las tablas, qué campos tienen y de qué tipos son cada uno. Cuanto más detalles dés, más acertadas seran las respuestas.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 04-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Explicandome un poco mejor

Tengo 3 tablas Clientes, productos y cargosfijos vamos a olvidarnos de la tabla productos realmente no la necesito y nos quedamos con clientes y cargosfijos.

En cargosfijos fijos tengo que vacíar la información de cada uno de los items que se le cobra a un cliente en particular mensualmente para que el sistema lo haga de forma automática, es decir al generar una factura en lote (a todos los clientes de un solo golpe) el sistema le va cargar el producto o servicio fijo a cada cliente, un ejemplo seria una empresa de cable, el plan familiar cuesta 80$, a final de mes se van a procesar todas las facturas masivas a esos clientes para eso es la tabla cargosfijos y ahí se guarda la información para dicha operación.

Ahora bien la tabla cargo fijos esta compuesta por los campos Cf_tipo,Cf_codigocliente, Cf_producto, CF_......

Dichos campos los voy a rellenar con valores fijos a excepcion de los campos CF_CodigoCliente y CF_Producto

EL campo CF_Cliente debo rellenarlo con el codigo de cada cliente que se encuentra en la tabla cliente donde dicho campo tiene como nombre TC_Cliente (muy diferente al nombre del campo en la tabla cargosfijos) que es lo que necesito rellenar las filas de la tabla cargosfijos con todos los codigos de los clientes que existen en el sistema que se guardan en la tabla clientes, donde el campo CF_Cliente es el unico campo que va cambiar en la tabla cargosfijos

El campo CF_Producto lo voy a rellenar con un txt para pode utilizar la aplicacion con otros sistemas que manejen la misma informacion.

Realice un insert pero obviamente me ejecuta la operacion una sola vez y no supe como llamar el campo TC_Cliente de la tabla cliente para ingresarlo en el campo CF_Cliente de la tabla scargosfijos.

Estoy trabajando con Delphi5, componente TDBISAM

Espero haberme explicado mejor, gracias y disculpen nuevamente saludos a todos.
Responder Con Cita
  #8  
Antiguo 04-11-2011
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Gracias por ampliar el mensaje, ahora es más fácil hacerse una idea de lo que necesitas.

Te aconsejo busques un manual de SQL para tu BBDD en cuestión porque te será mucho más fácil atacar estos problemas. Según lo dicho, todos los productos deben facturarse todos los meses, y para todos los clientes, porque es algo periódico, de ahí el nombre de la tabla cargos fijos, por tanto quedaría así:

La mejor forma de entender este mamotreto es desde dentro hacia afuera, es decir:
- la consulta más interna lo que hace es unir la tabla productos y clientes en una sola tabla temporal de forma que cada fila identifica un producto determinado de un cliente. De esa tabla, solo nos quedamos con el codigo del cliente (clientes.tc_cliente) y del codigo de producto (productos.codigoproducto).

- Ahora vamos a la consulta más externa: es una inserción masiva en dos campos de la tabla cargosfijos codigo cliente y codigo producto, y los valores que insertará será precisamente los de la consulta anterior, por tanto al final tenemos en cargosfijos "Un registro por cada producto de cada cliente" useasé, cargos fijos por esos productos mensuales consumidos.

Código SQL [-]
insert into cargosfijos(cf_codigocliente, cf_producto)
VALUES ( 
select clientes.tc_cliente, productos.codigoproducto 
from clientes inner join productos  on clientes.tc_cliente = productos.codigocliente)

He vuelto a suponer que en la tabla productos: el código de un producto lo guardas en el campo codigoproducto y además el código de cliente de ese producto lo guardas en el campo codigocliente

No he trabajado con TDBISAM, pero ese código es código SQL por lo que debería funcionar perfectamente.

Saludos y reitero las gracias por completar de forma detallada tu problema y tablas, así da gusto responder a mensajes... aunque sea un viernes a las 23:30
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 07-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Gracias Lepe por responder un viernes a las 23:30, yo veia peliculas a esa hora porque en casa no tengo internet

Por otro lado anidando ese código SQL a un ciclo repetitivo como lo valido para que me lo por la cantidad de clientes que hay en el sistema. es decir si hay 100 clientes se repita las 100 veces (obvio que uno para cada cliente).

Gracias

Saludos
Responder Con Cita
  #10  
Antiguo 07-11-2011
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Eso ya lo hace con solo ejecutarlo 1 vez.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 07-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Entiendo...

Bueno listo solo queda probarlo....


Muchas gracias Lepe...

Te estaré avisando...

Saludos....
Responder Con Cita
  #12  
Antiguo 10-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Codigo Incompleto

Código Delphi [-]
Procedure TF_CargosA.InsertaRegistros;
var fccodigo : string;
begin
  with DataM.Q_Clientes do
  begin
   while not Eof do
   begin;
   //First;
  DataM.Q_Clientes.SQL.Clear;
  DataM.Q_Clientes.Close;
  DataM.Q_Clientes.SQL.Add('SELECT FC_CODIGO FROM SCLIENTES');
  DataM.Q_Clientes.ExecSQL;
  fccodigo := FieldByName('FC_CODIGO').AsString;
  end;
    With DataM.Q_CargosF do
    begin
    Next;
  DataM.Q_CargosF.SQL.Clear;
  DataM.Q_CargosF.Close;
  DataM.Q_CargosF.SQL.Add('INSERT INTO SCARGOSFIJOS  (FCF_CLIENTE,FCF_CODIGOPRODUCTO)');
  DataM.Q_CargosF.SQL.Add('VALUES  (aram1, aram2)');
  DataM.Q_CargosF.ParamByName('param1').AsString := fccodigo;
  DataM.Q_CargosF.ParamByName('param2').AsString := Edit1.Text;
  DataM.Q_CargosF.ExecSQL;
    end;
  end; //while

end;

Saludos

Lepe estuve probando el código que me diste pero no me funciono, pero fue porque no me explique bien. pero bueno decidí echarle un poco por mi lado y obtuve el que me muestro arriba, me funciona bien pero tengo problemas con el while, no logro que lo haga mas de una vez, solo me inserta el primer registro en la fila...Que esta mal?

Gracias
Responder Con Cita
  #13  
Antiguo 11-11-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Estás usando el mismos dataset para gestionar el while y para hacer las inserciones. Al hacer el SQL.Clear, lo destripas.
Además, las instrucciones SQL no tienes que volverlas a crear. Simplemente, cambias los valores de los parámetros y las ejecutas.
Observa cómo he realzaido los bucles. Tu código no tiene mucha lógica, ya que no tiene las iteraciones hechas correctamente.

Echa un vistazo a este código y dinos qué te parece. Indenta el código correctamente, tú mismo lo agradecerás.

Código Delphi [-]
Procedure TF_CargosA.InsertaRegistros;
var fccodigo : string;
begin
  // defines la query de clientes
    DataM.Q_Clientes.SQL.Clear;
    DataM.Q_Clientes.Close;
    DataM.Q_Clientes.SQL.Add('SELECT FC_CODIGO FROM SCLIENTES');

  // defines la query de actualización
    DataM.Q_CargosF.SQL.Clear;
    DataM.Q_CargosF.Close;
    DataM.Q_CargosF.SQL.Add('INSERT INTO SCARGOSFIJOS  (FCF_CLIENTE,FCF_CODIGOPRODUCTO)');
    DataM.Q_CargosF.SQL.Add('VALUES  (aram1, aram2)');

  // abres la q de clientes y te posicionas en el primero
    DataM.Q_Clientes.Open;
    First;
  // recorres la query de clientes
    while not DataM.Q_Clientes.Eof do
      begin;
        // por cada registro, lanzas la query de actualización
        fccodigo := FieldByName('FC_CODIGO').AsString;
        DataM.Q_CargosF.ParamByName('param1').AsString := fccodigo;
        DataM.Q_CargosF.ParamByName('param2').AsString := Edit1.Text;
        DataM.Q_CargosF.ExecSQL;

        // siguiente registro de clientes
        Next;
     end; //while

end;

Espero que te sirva de ayuda

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #14  
Antiguo 11-11-2011
L3st4t L3st4t is offline
Miembro
 
Registrado: feb 2008
Posts: 24
Poder: 0
L3st4t Va por buen camino
Saludos, gracias por responder.

En base al que pasaste corregi el mio, el cual funcionaba bien solo que tenia algunas cosas de mas...

Pero estoy muy agradecido...


Buen dia...
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
Insertar Datos a un campo de la base de datos desde un DBEdit saltamirano Varios 11 12-12-2007 17:29:35
como desplegar mensaje repetitivo en rango de tiempo Jheysson13 Varios 2 15-11-2006 18:47:23
Insertar datos en Base de Datos aoiTo C++ Builder 2 18-06-2006 15:42:43
crear label por codigo en un ciclo for.. las beses de el ciclo sakuragi .NET 3 29-09-2005 05:04:29
validar una fecha en un ciclo repetitivo.... uper Varios 6 25-05-2005 02:21:10


La franja horaria es GMT +2. Ahora son las 23:51:04.


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