Tem como deixar mais "estilo Harbour"

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tem como deixar mais "estilo Harbour"

Mensagem por JoséQuintas »

leis1.png
Os produtos de pedido contém os códigos de leis, pra informações adicionais.
Vou juntar todas de todos os produtos, pra colocar no pedido.
leis2.png
À primeira vista, deu certo.

Código: Selecionar todos

CREATE PROCEDURE `pedidoLeis`(
	IN `nIdPedido` INT
)
BEGIN
      
DECLARE z, nLen, nCont INT;
DECLARE A, cText VARCHAR(500) DEFAULT '';
DECLARE SP_CURSOR CURSOR FOR SELECT IPLEIS FROM JPITPED WHERE IPPEDIDO = nIdPedido;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET z = 1;

OPEN SP_CURSOR;
REPEAT
   FETCH SP_CURSOR INTO A;
   IF INSTR( A, ',' ) <> 0 THEN
      SET nLen = 7;
   ELSE
      SET nLen = 6;
   END IF;
   SET nCont = 1;
   REPEAT
      IF INSTR( cText, SUBSTR( A, nCont, 6 ) ) = 0 THEN
         SET cText = CONCAT( cText, SUBSTR( A, nCont, 6 ), ',' );
      END IF;   
      SET nCont = nCont + nLen;
   UNTIL nCont > LENGTH( A )
   END REPEAT;
UNTIL ( z = 1 )
END REPEAT;
CLOSE SP_CURSOR;
SELECT cText;

END
Tem como deixar "mais Harbour" ?

Nota:
antigamente usava 6 números juntos sem separação, agora separados por vírgula, por isso a opção para os dois casos.
Por enquanto é teste, dá pra alterar todo passado usando vírgula, pra não precisar ficar testando se está de um jeito ou de outro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tem como deixar mais "estilo Harbour"

Mensagem por JoséQuintas »

leis.png
expandindo um pouco, ainda em testes.
acrescentado pra retornar como uma tabela, a lista de códigos e "apelido" da lei.

Código: Selecionar todos

SELECT ctext, lei, denome FROM
( select CAST( SUBSTR( ctext, 1, 6 ) as INT ) as lei
union select CAST( SUBSTR( cText, 8, 6 ) as INT )
union select CAST( SUBSTR( cText, 15, 6 ) as INT )
union select CAST( SUBSTR( ctext, 22, 6 ) as INT )
union select CAST( SUBSTR( ctext, 29, 6 ) as INT )
union select CAST( SUBSTR( ctext, 36, 6 ) as INT )
union select CAST( SUBSTR( ctext, 43, 6 ) as INT )
) as x
LEFT JOIN jptabdecreto AS a ON x.lei = a.iddecreto;
Não é o ideal, porque está pra tamanho/quantidade fixos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tem como deixar mais "estilo Harbour"

Mensagem por JoséQuintas »

Talvez.... melhor repensar.
Se remodelar os dados...
Pode se tornar mais prático criar uma tabela separada, e trazer a lista pronta.
Menos complicação.

Código: Selecionar todos

SELECT DISTINCT IdMensagem from jpitpedmsg WHERE ipPedido = IdPedido
Se no SQL mais prático fazer operação com tabelas... é transformar tudo em tabelas... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tem como deixar mais "estilo Harbour"

Mensagem por JoséQuintas »

subs.png
Achei essa função.
Só não sei se ela pode ajudar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tem como deixar mais "estilo Harbour"

Mensagem por JoséQuintas »

A propósito....
Usei WHILE ao invés de REPEAT, acho que fica mais familiar.

Código: Selecionar todos

CREATE PROCEDURE ze_pedidoLeis( nIdPedido INT )

BEGIN

DECLARE z, nLen, nCont INT DEFAULT 0;
DECLARE A, cText VARCHAR(500) DEFAULT '';
DECLARE SP_CURSOR CURSOR FOR SELECT IPLEIS FROM jpitped ; /* WHERE IPPEDIDO = nIdPedido; */
DECLARE CONTINUE HANDLER FOR NOT FOUND SET z = 1;

OPEN SP_CURSOR;
THIS:WHILE z <> 1 DO
   FETCH SP_CURSOR INTO A;
   IF z = 1 THEN
      LEAVE THIS;
   END IF;
   IF INSTR( A, ',' ) <> 0 THEN
      SET nLen = 7;
   ELSE
      SET nLen = 6;
   END IF;
   SET nCont = 1;
   WHILE nCont <= LENGTH( A ) DO
      IF LENGTH( TRIM( SUBSTR( A, nCont, 6 ) ) ) <> 0 THEN
         IF INSTR( cText, SUBSTR( A, nCont, 6 ) ) = 0 THEN
            SET cText = CONCAT( cText, SUBSTR( A, nCont, 6 ), ',' );
         END IF;
      END IF;
      SET nCont = nCont + nLen;
   END WHILE;
END WHILE THIS;
CLOSE SP_CURSOR;

/* UPDATE JPPEDIDO SET PDLEIS = cText WHERE IDPEDIDO = nIdPedido */

SELECT ctext, lei, denome FROM
( select CAST( SUBSTR( ctext, 1, 6 ) as INT ) as lei
union select CAST( SUBSTR( cText, 8, 6 ) as INT )
union select CAST( SUBSTR( cText, 15, 6 ) as INT )
union select CAST( SUBSTR( ctext, 22, 6 ) as INT )
union select CAST( SUBSTR( ctext, 29, 6 ) as INT )
union select CAST( SUBSTR( ctext, 36, 6 ) as INT )
union select CAST( SUBSTR( ctext, 43, 6 ) as INT )
) as x
LEFT JOIN jptabdecreto AS a ON x.lei = a.iddecreto;

END
Como teste, estou usando tudo que é produto de tudo que é pedido.
Demora muito com 200 mil itens de pedido, quase 4 segundos, mas é um bom teste.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder