Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Normalizar columna Base datos (https://www.clubdelphi.com/foros/showthread.php?t=68653)

Taburiente 27-06-2010 09:56:18

Normalizar columna Base datos
 
Hola a todos,

Nuevamente acudo a vosotros para ver si me podeis ayudar a resolver el siguiente problema:

Tengo una base datos "Interbase" con una tabla llamada "piezas" y en ella una columna llamada "REF" y cuyos datos no son numerico y estan tal com el siguiente ejemplo:

REF
000100-S
085143E
973
1000
X806582-00
2315
BG24204066

Y así hasta unos 20.000 registros, mi problema viene en que ahora dichas referencias deben tener un mínimo de 6 registros, es decir (basándonos en el ejemplo anterior) debo transformar la referencia 973 en 000973 y las que tengan mas de 6 no tocarlas(ejemplo: 085143E), con un administrador de base de datos puedo ir editando una a una todos aquellos registro que deseo pero como son muchos es por lo que acudo a vuestra ayuda para intentar resolver este, para mi, gran problema.

Desde ya les estoy muy agradecido

Un saludo

Taburiente

Rockin 28-06-2010 13:35:55

Puedes ir recorriendo cada registro y ver la longitud que tiene, si es menor que 6 le añades y si no pues pasas al siguiente, algo así.

1º) Selecciona todos los registros
2º) los recorres así

Código:

for i:= 1 to num_registros do
begin
    referencia:= TableName.FieldBYname('referencia').AsString //vemos la referencia


      while Lentgh (referencia < 6) do //mientras sea menor de 6 añadimos un 0
      begin
          referencia:= '0' + referencia
      end;

TableName.nex;
end;

No se que componentes usas de conexión ni nada, pero sería algo así, también pordrías hacerlo con un procedimiento almacenado.

Espero que te sirva de ayuda

Taburiente 30-06-2010 17:41:02

Gracias Rockin por tu repuesta, en algo como eso había también yo pensado, lo que si quería saber es si seria posible normalizar dicha columna con alguna sentencia sql o algo por el estilo y utilizando algún administrador de base de datos (EMS sql manager por ejemplo).

Saludos




PD: he tenido bastantes problemas para entrar en esta pagina porque mi navegador decia que este sito es potencialmente peligroso y no me dejaba entrar :cool:

rastafarey 01-07-2010 05:56:45

Resp
 
Código SQL [-]
/*Declara estas dos funciones*/
DECLARE EXTERNAL FUNCTION lpad 
  CSTRING(255), INTEGER, CSTRING(1)
  RETURNS CSTRING(255) FREE_IT
  ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf';

DECLARE EXTERNAL FUNCTION strlen 
  CSTRING(32767)
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';

/*esto es para que pruebes como te quedarian los datos*/
Select Case
         When (strlen(Ref) < 6) Then Lpad(Ref, 6, '0')
         Else Ref
       End As Ref
From Piezas

/*Aqui arreglas tu base de datos*/
Update Piezas Set
       Ref =  Lpad(Ref, 6, '0')
Where strlen(Ref) < 6
Espero te funcione

Taburiente 01-07-2010 15:57:40

Gracias rastafarey, eres un genio, dime a donde te mando las cervezas, jejejeje :)



Saludos

rastafarey 05-07-2010 17:30:42

resp
 
Bueno espero te haya funcionado.
Las cervezas me las debes.


La franja horaria es GMT +2. Ahora son las 22:23:20.

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