Página 1 de 1

Tem como deixar mais "estilo Harbour"

Enviado: 12 Jul 2021 19:16
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.

Tem como deixar mais "estilo Harbour"

Enviado: 13 Jul 2021 06:19
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.

Tem como deixar mais "estilo Harbour"

Enviado: 13 Jul 2021 08:02
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

Tem como deixar mais "estilo Harbour"

Enviado: 13 Jul 2021 09:16
por JoséQuintas
subs.png
Achei essa função.
Só não sei se ela pode ajudar.

Tem como deixar mais "estilo Harbour"

Enviado: 13 Jul 2021 20:07
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.