Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-10-2012
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tucuman - Argentina
Posts: 45
Poder: 0
Adrian Murua Va por buen camino
Cool Crear una sentencia para update.

Estimados Amigos:

Tengo la siguiente situacion :
Una Tabla MySQL, con la siguiente estructura:


Código SQL [-]
afiliadoscontrol( innoDB)
---------
id  int autonumeric,  (PK)
codigo varchar (25),
principal tinyint ,  
afiliados_id int,     (FK)  -> tabla afiliados.

Esta tabla forma parte de una base de datos del sistema administrativo de una Mutual, y contiene los codigos de control de las cuentas (internas de la mutual) de cada afiliado, en la mayoria de los casos cada afiliado tiene solo una cuenta o codigo de control, pero ultimamente tambien pueden tener mas de una cuenta o codigo de control, por medio de este codigo se le cobra la cuota societaria, hice referencia a que ultimamente pueden tener mas de un codigo, por lo que tuve que agregar un campo a la tabla ( principal ) para usar solo uno de los codigos para efectuar el cobro y de esta manera no cobrarle de nuevo la cuota al afiliado.

Por politica se tomo el primer codigo ingresado, como el que se usa para efectuar el cobro de la cuota, es decir que el campo principal tendria un valor de "1", para ese codigo y "0", para los restantes.

Mi problema es como actualizar el campo principal de toda la tabla para reflejar lo antes dicho. considerando que la tabla ya tiene datos ingresados.

Por Ejemplo:

Código SQL [-]
tabla afiliadoscontrol. ( como se encuentra actualmente )
---------------------

id   codigo   principal  afiliados_id

1  62542474         0  123
2  62548725         0  123


tabla afiliadoscontrol. ( como deberia quedar luego de la actualizacion )
---------------------

id   codigo   principal  afiliados_id

1  62542474         1  123
2  62548725         0  123
Como podria actualizar la tabla con una sentencia SQL, considerando que no podria hacerlo uno por uno ya que son aprox. 3000 registros.

desde ya muchas gracias.
__________________
Adrián Murúa.
Responder Con Cita
  #2  
Antiguo 17-10-2012
Avatar de Young
Young Young is offline
Miembro
 
Registrado: abr 2006
Ubicación: San Felipe, Chile
Posts: 86
Poder: 19
Young Va por buen camino
Hola, intenta con esta sentencia, la verdad no trabajo con Mysql pero supongo que soporta el standard.

Código SQL [-]
update afiliadoscontrol
set afiliadoscontrol.principal = 1
where afiliadoscontrol.id = 1;

Saludos.
Responder Con Cita
  #3  
Antiguo 17-10-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Hola: Muy bien no entiendo el problema pero si lo que necesitas es hacerlo solo una vez puedes hacerlo a través de un bucle, por ejemplo un Query (Le pongo Afiliados) que contenga

Código SQL [-]
Select Afiliados_id,Min(Id) as indice from AfiliadosControl
Group by Afiliados_Id

Esto te evitada mostrara solo el "menor" en id y sin duplicados ya que estas agrupando los afiliados, luego:

Código Delphi [-]
With TuComponenteSql do
Begin
   Close;
   Sql.Clear;
   Sql.Add('Uptade AfiliadosControl');
   Sql.Add('Set');
   Sql.Add('Principal = 1');
   Sql.Add('Where Id = :Codigo');
   While not Afiliados.Eof d
   Begin
       ParamByName('Codigo').AsInteger := Afiliandos.FieldByName('Indice').Asinteger;
       ExecQuery;
       Afiliados.Next;
   end;
end;


Nota: Nuevamente no se si lo haces una sola vez y ya o lo deseas hacer seguido, es decir, que es parte del sistema que lo haga habitualmente. En ese caso deberias probar algo como esto donde el bloque select muestra aquellos que se estan repitiendo pero no lo he probado y lo arme medio de memoria y por aproximacion

Código SQL [-]
Update afiliadosControl
Set
 Principal = 1
Where Id <> (Select id,Afiliados_id from AfiliadosControl a1
inner join AfiliadosControl a2
on a1.afiliados_id = a2.afiliados_id 
and a1.id < a2.id)



(Obviamente mucho no entiendo el problemilla)



Saludos
Responder Con Cita
  #4  
Antiguo 18-10-2012
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tucuman - Argentina
Posts: 45
Poder: 0
Adrian Murua Va por buen camino
Cool

Hola a todos , gracias por responder.
con respecto a la respuesta de Young.

Código SQL [-]
update afiliadoscontrol
set afiliadoscontrol.principal = 1
where afiliadoscontrol.id = 1;

El ejemplo que puse , hacia referencia a que un afiliado podia tener dos o mas codigos de control, por lo tanto si tenia dos codigos , el primer codigo ingresado en el sistema ( que corresponderia al valor menor del campo id ) deberia tener "1" en su campo "principal", y el segundo codigo , o los otros, si tiene mas de dos , tendrian un "0" en el campo principal. tu sugerencia seria correcta si solo existiera solamente un afiliado en la empresa y tuviera dos codigos de controles. En la clausula Where afiliadoscontrol_id tendria que ser igual al Min(de todos los ID de los codigos de control del usuario en cuestion). Es decir si el usuario tiene dos codigos , seria el menor de los dos, si tiene 4 seria el menor de los cuatro y asi en mas. Lo pude de esa forma pues eso es lo que no se como expresarlo en SQL. Gracias por tu respuesta.

Con respecto a la respuesta de MartinS.

Lo necesito hacer solo una vez, pues seria "acomodar" los datos ingresados ( los codigos ) del afiliado antes de haber agregado el campo "principal" a la tabla afiliadoscontrol, voy a probar usar la combinacion Delphi-MySQL, y despues te cuento. Gracias por tu respuesta.
__________________
Adrián Murúa.
Responder Con Cita
  #5  
Antiguo 18-10-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Que tal esto:
Código SQL [-]
UPDATE AfiliadosControl
  SET
    PRINCIPAL = 1
  WHERE ID IN
    (
      SELECT
          MIN(ID)
        FROM AfiliadosControl
        GROUP BY AFILIADOS_ID
    )

Un saludo
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
  #6  
Antiguo 18-10-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Hola Olbeup: Tienes toda la razon. No sabia que se podia agrupar por un campo que no estuviera explicito en el select. Algo nuevo aprendido

Saludos.-
Responder Con Cita
  #7  
Antiguo 18-10-2012
Avatar de Young
Young Young is offline
Miembro
 
Registrado: abr 2006
Ubicación: San Felipe, Chile
Posts: 86
Poder: 19
Young Va por buen camino
Cita:
Empezado por MartinS Ver Mensaje
Hola Olbeup: Tienes toda la razon. No sabia que se podia agrupar por un campo que no estuviera explicito en el select. Algo nuevo aprendido

Saludos.-
Me parece que esa sentencia no está del todo correcta, primero por que no hay una limitación a un id específico, por lo tanto obtendras el minimo id pero de quien?... y por lo que entiendo el campo de agrupación debe estar en el select.

Saludos.
Responder Con Cita
  #8  
Antiguo 18-10-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Cita:
Empezado por Young Ver Mensaje
... por lo tanto obtendras el minimo id pero de quien?... y por lo que entiendo el campo de agrupación debe estar en el select.

Saludos.
La sentencia expuesta por Olbeup agrupa los campos por el Afiliado_Id y toma el menor de los id. En el ejemplo de Adrian lo que necesita es poner un 1 solo a un registro de cada afiliado:
Asi lo tiene él:

Código:
Id   XXX  Principal   Afiliado_Id
1              0              123
2              0              123 
3              0              123
4              0              124
5              0              126
6              0              125
7              0              126
8              0              125
9              0              125
lo que desea es agregar el uno pero a un solo registro no a todos. Por lo tanto con la sentencia el resultado del select es

Código:
ID
1
4
5
6
Es decir agrupados mostrando el menor de los indices (y una sola columna). Luego con la sentencia Update actualiza y pone el uno a los id mostrados (1,4,5,6) Resultando

Código:
Id   XXX  Principal   Afiliado_Id
1              1              123
2              0              123 
3              0              123
4              1              124
5              1              126
6              1              125
7              0              126
8              0              125
9              0              125
Yo tambien primero hice las prueba con el campo Afiliados_id dentro del select pero el resultado si bien era el mismo, mostraba el grupo pero con dos columnas, es decir

Código:
ID      Afiliado_ID
1           123
4           124
5           126 
6           125
Por eso sugeri que hiciera un bucle ya que la sentencia del Where id in... requiere una sola columna y yo listo dos.-

Saludos
Responder Con Cita
  #9  
Antiguo 19-10-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Cita:
Empezado por MartinS Ver Mensaje
Hola Olbeup: Tienes toda la razon. No sabia que se podia agrupar por un campo que no estuviera explicito en el select. Algo nuevo aprendido

Saludos.-
Gracias MartinS , con tu ejemplo pude sacar la SQL, creo que nuestro compañero, Young no sabe que se puede hacer cosas muy grandes en poco código.

Con el ejemplo muy bien explicado, espero que lo haya entendido Young, creo que la sentencia SQL que he escrito, no lo has probado.

Un saludo.

P.D.: Repasa SQL Young
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 19-10-2012 a las 08:54:54.
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 sentencia SQL despues de Insert,update o delete vivamotos Firebird e Interbase 10 02-08-2011 18:24:30
Ayuda para crear sentencia SQL Mauro® Conexión con bases de datos 1 12-05-2008 20:39:24
Sentencia UPDATE kikecg SQL 5 16-10-2006 11:23:24
Crear un backup por sentencia sql y recuperarlo Jorge Taveras SQL 0 10-02-2005 02:15:25
Como crear una sentencia SQL (Insert, update y delete) sitrico Conexión con bases de datos 1 14-10-2004 00:02:42


La franja horaria es GMT +2. Ahora son las 15:17: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