[firebase-br] "DO SUSPEND"

Mário Reis mariodosreyx em gmail.com
Terça Setembro 26 09:57:56 -03 2023


Afinal não funciona mesmo. Só faz um insert... ainda não consegui perceber
porquê.
Vou tentar executar uma outra procedure que faça o insert na BASE INTERNA,
tabela->Pessoas

Finalmente consegui:Parece que só funciona assim:

CREATE PROCEDURE CONSULTA_EXTERNA(IN_USER TYPE OF USERID,   IN_PWD
VARCHAR(10),   IN_ID SMALLINT)
RETURNS(
  OUT_NOSOC TYPE OF COLUMN SOCIOS.NOSOC_ID,
  OUT_DTADM TYPE OF COLUMN SOCIOS.DATADM,
  PESSOA_ID TYPE OF COLUMN PESSOAS.PESSOA_ID,
  TITULO_ID TYPE OF COLUMN PESSOAS.TITULO_ID,
  APELIDO TYPE OF COLUMN PESSOAS.APELIDO,
  NOME TYPE OF COLUMN PESSOAS.NOME,
  TIPO_ID TYPE OF COLUMN PESSOAS.TIPO_ID,
  NOBI TYPE OF COLUMN PESSOAS.NOBI,
  ARQIDENT TYPE OF COLUMN PESSOAS.ARQIDENT,
  DATEMIBI TYPE OF COLUMN PESSOAS.DATEMIBI,
  SEXO TYPE OF COLUMN PESSOAS.SEXO,
  ESTCIVIL TYPE OF COLUMN PESSOAS.ESTCIVIL,
  DAT_NASC TYPE OF COLUMN PESSOAS.DAT_NASC,
  NIF TYPE OF COLUMN PESSOAS.NIF,
  RFEMIT_NIF TYPE OF COLUMN PESSOAS.RFEMIT_NIF,
  DATNIF TYPE OF COLUMN PESSOAS.DATNIF,
  NOSEGSOCIAL TYPE OF COLUMN PESSOAS.NOSEGSOCIAL,
  RFEMIT_SEGSOC TYPE OF COLUMN PESSOAS.RFEMIT_SEGSOC,
  DATSEGSOC TYPE OF COLUMN PESSOAS.DATSEGSOC,
  CONCNASC_ID TYPE OF COLUMN PESSOAS.CONCNASC_ID,
  FREGNASC_ID TYPE OF COLUMN PESSOAS.FREGNASC_ID,
  PROFISSO_ID TYPE OF COLUMN PESSOAS.PROFISSO_ID,
  EMPRESA_ID TYPE OF COLUMN PESSOAS.EMPRESA_ID,
  RELACAO_ID TYPE OF COLUMN PESSOAS.RELACAO_ID,
  ENTMST_ID TYPE OF COLUMN PESSOAS.ENTMST_ID,
  SITUAC_ID TYPE OF COLUMN PESSOAS.SITUAC_ID,
  SINDICATO_ID TYPE OF COLUMN PESSOAS.SINDICATO_ID,
  ILHA_ID TYPE OF COLUMN PESSOAS.ILHA_ID,
  NASC_RES TYPE OF COLUMN PESSOAS.NASC_RES,
  USERID TYPE OF COLUMN PESSOAS.USERID,
  ESTACAO TYPE OF COLUMN PESSOAS.ESTACAO,
  "DATA" TYPE OF COLUMN PESSOAS."DATA",
  HORA TYPE OF COLUMN PESSOAS.HORA,
  SITU TYPE OF COLUMN PESSOAS.SITU,
  ACCAO TYPE OF COLUMN PESSOAS.ACCAO,
  DEPENDE_ID TYPE OF COLUMN PESSOAS.DEPENDE_ID,
  DD TYPE OF COLUMN PESSOAS.DD,
  CC TYPE OF COLUMN PESSOAS.CC,
  FF TYPE OF COLUMN PESSOAS.FF,
  DATA_C TYPE OF COLUMN PESSOAS.DATA_C,
  NOBI12 TYPE OF COLUMN PESSOAS.NOBI12,
  NACIONALIDADE TYPE OF COLUMN PESSOAS.NACIONALIDADE,
  NMPAI TYPE OF COLUMN PESSOAS.NMPAI,
  INDEVTPAI TYPE OF COLUMN PESSOAS.INDEVTPAI,
  NMMAE TYPE OF COLUMN PESSOAS.NMMAE,
  INDEVTMAE TYPE OF COLUMN PESSOAS.INDEVTMAE,
  NUTSNS TYPE OF COLUMN PESSOAS.NUTSNS,
  LOC_PEDIDO TYPE OF COLUMN PESSOAS.LOC_PEDIDO,
  VERSAOCARTAO TYPE OF COLUMN PESSOAS.VERSAOCARTAO,
  ESTADOCARTAO TYPE OF COLUMN PESSOAS.ESTADOCARTAO,
  DATVALIDAD TYPE OF COLUMN PESSOAS.DATVALIDAD,
  ALTURA TYPE OF COLUMN PESSOAS.ALTURA,
  DTHRPRT TYPE OF COLUMN PESSOAS.DTHRPRT,
  DHPRINT TYPE OF COLUMN PESSOAS.DHPRINT,
  CCUSTOS TYPE OF COLUMN PESSOAS.CCUSTOS)
AS
DECLARE VARIABLE SEXTERNAL_DB VARCHAR(255);
DECLARE VARIABLE SSQL VARCHAR(2500);
BEGIN

  SEXTERNAL_ DB='MY_IP.PT/3054:C
:\Firebird\Fb30\Producao\Dados\PRODUCAO.FDB';

   sSql=' SELECT '||
   ' P.PESSOA_ID, P.TITULO_ID, P.APELIDO, P.NOME, P.TIPO_ID, P.NOBI,
P.ARQIDENT, P.DATEMIBI, P.SEXO, '||
   ' P.ESTCIVIL, P.DAT_NASC, P.NIF, P.RFEMIT_NIF, P.DATNIF, P.NOSEGSOCIAL,
P.RFEMIT_SEGSOC, '||
   ' P.DATSEGSOC, P.CONCNASC_ID, P.FREGNASC_ID, P.PROFISSO_ID,
P.EMPRESA_ID, P.RELACAO_ID, '||
   ' P.ENTMST_ID, P.SITUAC_ID, P.SINDICATO_ID, P.ILHA_ID, P.NASC_RES,
P.USERID, P.ESTACAO, P.DATA, '||
   ' P.HORA, P.SITU, P.ACCAO, P.DEPENDE_ID, P.DD, P.CC, P.FF, P.DATA_C,
P.NOBI12, P.NACIONALIDADE, '||
   ' P.NMPAI, P.INDEVTPAI, P.NMMAE, P.INDEVTMAE, P.NUTSNS, P.LOC_PEDIDO,
P.VERSAOCARTAO, P.ESTADOCARTAO, '||
   ' P.DATVALIDAD, P.ALTURA, P.DTHRPRT, P.DHPRINT, P.CCUSTOS, S.NOSOC_ID,
S.DATADM '||
   ' FROM PESSOAS P '||
   ' INNER JOIN SOCIOS S ON S.SOCIOS_ID=P.PESSOA_ID '||
   ' WHERE S.NOSOC_ID >= '||TRIM(CAST( :IN_ID AS VARCHAR(15)) );

/* *INICIO DO CICLO DE CONSULTA EXTERNA À BASE DE DADOS EM PRODUÇÃO:* */
  FOR
   EXECUTE STATEMENT
      (  :sSql  )
      ON EXTERNAL DATA SOURCE :sDB
      AS USER :IN_USER PASSWORD :IN_PWD -- parameter
      WITH AUTONOMOUS TRANSACTION
      INTO
      :PESSOA_ID, :TITULO_ID, :APELIDO, :NOME, :TIPO_ID,
     :NOBI, :ARQIDENT, :DATEMIBI, :SEXO, :ESTCIVIL, :DAT_NASC,
     :NIF, :RFEMIT_NIF, :DATNIF, :NOSEGSOCIAL,:RFEMIT_SEGSOC,
     :DATSEGSOC, :CONCNASC_ID, :FREGNASC_ID, :PROFISSO_ID,
     :EMPRESA_ID, :RELACAO_ID, :ENTMST_ID, :SITUAC_ID,
     :SINDICATO_ID, :ILHA_ID, :NASC_RES, :USERID, :ESTACAO,
     :DATA, :HORA, :SITU, :ACCAO, :DEPENDE_ID, :DD, :CC, :FF,
     :DATA_C, :NOBI12, :NACIONALIDADE, :NMPAI, :INDEVTPAI,:NMMAE,
     :INDEVTMAE, :NUTSNS, :LOC_PEDIDO, :VERSAOCARTAO, :ESTADOCARTAO,
     :DATVALIDAD, :ALTURA, :DTHRPRT, :DHPRINT, :CCUSTOS, :OUT_NOSOC,
:OUT_DTADM
    DO

    BEGIN

/*
Penso que só funciona assim atenta a forma como a memória é partilhada!
Porém, não estou certo disso. Terei ainda que fazer e
Ao tentar inserir um novo registo dentro deste ciclo "FOR..."  fiquei com a
ideia que o FB estava
a ver e a tentar inserir o novo registo na tabela da EXTERNAL DATA SOURCE
presente no ciclo...
Enfim! É o que é. Mas não deixa de ser uma sintaxe mega estranha!
Seria mais fácil se fosse possível usar um "ALIAS" distinto para as
diferentes conexões e usá-lo nas Queries...
Por exemplo Select * from *D.*Pessoas...etc onde *"D" *fosse o alias para a
base externa e
por exemplo Insert into *A.*Pessoas...etc onde *"A"* fosse aliás para a
base interna.
Creio já ter visto isso feito num outro data engine...não tenho a certeza!
Ganhava-se pelo menos em termos de clarificação quando como neste exemplo
estou a ler dados de uma tabela de uma "base externa" e
inseri-los numa "interna"

Enfim! Se é o que temos, nada a fazer...

 */


/* FAZER INSERT NA  "*INTERNAL*" DATA SOURCE : BASE DE DADOS EM MIGRAÇÃO  */
/* INTERNAL_DB='MY_IP.PT/3050:C
<http://MY_IP.PT/3054:C>:\Firebird\Fb30\MIGRACAO\Dados\MIGRACAO_GEST.FDB';
*/

     EXECUTE PROCEDURE PESSOAS_INS(
    :PESSOA_ID,
    :TITULO_ID,
    :APELIDO,
    :NOME,
    :TIPO_ID,
    :NOBI,
    :ARQIDENT,
    :DATEMIBI,
    :SEXO,
    :ESTCIVIL,
    :DAT_NASC,
    :NIF,
    :RFEMIT_NIF,
    :DATNIF,
    :NOSEGSOCIAL,
    :RFEMIT_SEGSOC,
    :DATSEGSOC,
    :CONCNASC_ID,
    :FREGNASC_ID,
    :PROFISSO_ID,
    :EMPRESA_ID,
    :RELACAO_ID,
    :ENTMST_ID,
    :SITUAC_ID,
    :SINDICATO_ID,
    :ILHA_ID,
    :NASC_RES,
    :USERID,
    :ESTACAO,
    :"DATA",
    :HORA,
    :SITU,
    :ACCAO,
    :DEPENDE_ID,
    :DD,
    :CC,
    :FF,
    :DATA_C,
    :NOBI12,
    :NACIONALIDADE,
    :NMPAI,
    :INDEVTPAI,
    :NMMAE,
    :INDEVTMAE,
    :NUTSNS,
    :LOC_PEDIDO,
    :VERSAOCARTAO,
    :ESTADOCARTAO,
    :DATVALIDAD,
    :ALTURA,
    :DTHRPRT,
    :DHPRINT,
    :CCUSTOS);
    SUSPEND  ;
  end



END;



CREATE PROCEDURE PESSOAS_INS(
  PESSOA_ID TYPE OF COLUMN PESSOAS.PESSOA_ID,
  TITULO_ID TYPE OF COLUMN PESSOAS.TITULO_ID,
  APELIDO TYPE OF COLUMN PESSOAS.APELIDO,
  NOME TYPE OF COLUMN PESSOAS.NOME,
  TIPO_ID TYPE OF COLUMN PESSOAS.TIPO_ID,
  NOBI TYPE OF COLUMN PESSOAS.NOBI,
  ARQIDENT TYPE OF COLUMN PESSOAS.ARQIDENT,
  DATEMIBI TYPE OF COLUMN PESSOAS.DATEMIBI,
  SEXO TYPE OF COLUMN PESSOAS.SEXO,
  ESTCIVIL TYPE OF COLUMN PESSOAS.ESTCIVIL,
  DAT_NASC TYPE OF COLUMN PESSOAS.DAT_NASC,
  NIF TYPE OF COLUMN PESSOAS.NIF,
  RFEMIT_NIF TYPE OF COLUMN PESSOAS.RFEMIT_NIF,
  DATNIF TYPE OF COLUMN PESSOAS.DATNIF,
  NOSEGSOCIAL TYPE OF COLUMN PESSOAS.NOSEGSOCIAL,
  RFEMIT_SEGSOC TYPE OF COLUMN PESSOAS.RFEMIT_SEGSOC,
  DATSEGSOC TYPE OF COLUMN PESSOAS.DATSEGSOC,
  CONCNASC_ID TYPE OF COLUMN PESSOAS.CONCNASC_ID,
  FREGNASC_ID TYPE OF COLUMN PESSOAS.FREGNASC_ID,
  PROFISSO_ID TYPE OF COLUMN PESSOAS.PROFISSO_ID,
  EMPRESA_ID TYPE OF COLUMN PESSOAS.EMPRESA_ID,
  RELACAO_ID TYPE OF COLUMN PESSOAS.RELACAO_ID,
  ENTMST_ID TYPE OF COLUMN PESSOAS.ENTMST_ID,
  SITUAC_ID TYPE OF COLUMN PESSOAS.SITUAC_ID,
  SINDICATO_ID TYPE OF COLUMN PESSOAS.SINDICATO_ID,
  ILHA_ID TYPE OF COLUMN PESSOAS.ILHA_ID,
  NASC_RES TYPE OF COLUMN PESSOAS.NASC_RES,
  USERID TYPE OF COLUMN PESSOAS.USERID,
  ESTACAO TYPE OF COLUMN PESSOAS.ESTACAO,
  "DATA" TYPE OF COLUMN PESSOAS."DATA",
  HORA TYPE OF COLUMN PESSOAS.HORA,
  SITU TYPE OF COLUMN PESSOAS.SITU,
  ACCAO TYPE OF COLUMN PESSOAS.ACCAO,
  DEPENDE_ID TYPE OF COLUMN PESSOAS.DEPENDE_ID,
  DD TYPE OF COLUMN PESSOAS.DD,
  CC TYPE OF COLUMN PESSOAS.CC,
  FF TYPE OF COLUMN PESSOAS.FF,
  DATA_C TYPE OF COLUMN PESSOAS.DATA_C,
  NOBI12 TYPE OF COLUMN PESSOAS.NOBI12,
  NACIONALIDADE TYPE OF COLUMN PESSOAS.NACIONALIDADE,
  NMPAI TYPE OF COLUMN PESSOAS.NMPAI,
  INDEVTPAI TYPE OF COLUMN PESSOAS.INDEVTPAI,
  NMMAE TYPE OF COLUMN PESSOAS.NMMAE,
  INDEVTMAE TYPE OF COLUMN PESSOAS.INDEVTMAE,
  NUTSNS TYPE OF COLUMN PESSOAS.NUTSNS,
  LOC_PEDIDO TYPE OF COLUMN PESSOAS.LOC_PEDIDO,
  VERSAOCARTAO TYPE OF COLUMN PESSOAS.VERSAOCARTAO,
  ESTADOCARTAO TYPE OF COLUMN PESSOAS.ESTADOCARTAO,
  DATVALIDAD TYPE OF COLUMN PESSOAS.DATVALIDAD,
  ALTURA TYPE OF COLUMN PESSOAS.ALTURA,
  DTHRPRT TYPE OF COLUMN PESSOAS.DTHRPRT,
  DHPRINT TYPE OF COLUMN PESSOAS.DHPRINT,
  CCUSTOS TYPE OF COLUMN PESSOAS.CCUSTOS)
AS
DECLARE VARIABLE WPESSOA_ID TYPE OF COLUMN PESSOAS.PESSOA_ID;
BEGIN

 Select PESSOA_ID from pessoas P1  where p1.PESSOA_ID=:PESSOA_ID INTO
:WPESSOA_ID;
/** CASO NÃO EXISTA ENTÃO CRIA NOVO NA BASE DE MIGRAÇÃO **/
IF (ROW_COUNT=0) THEN
  INSERT INTO PESSOAS (
    PESSOA_ID,
    TITULO_ID,
    APELIDO,
    NOME,
    TIPO_ID,
    NOBI,
    ARQIDENT,
    DATEMIBI,
    SEXO,
    ESTCIVIL,
    DAT_NASC,
    NIF,
    RFEMIT_NIF,
    DATNIF,
    NOSEGSOCIAL,
    RFEMIT_SEGSOC,
    DATSEGSOC,
    CONCNASC_ID,
    FREGNASC_ID,
    PROFISSO_ID,
    EMPRESA_ID,
    RELACAO_ID,
    ENTMST_ID,
    SITUAC_ID,
    SINDICATO_ID,
    ILHA_ID,
    NASC_RES,
    USERID,
    ESTACAO,
    "DATA",
    HORA,
    SITU,
    ACCAO,
    DEPENDE_ID,
    DD,
    CC,
    FF,
    DATA_C,
    NOBI12,
    NACIONALIDADE,
    NMPAI,
    INDEVTPAI,
    NMMAE,
    INDEVTMAE,
    NUTSNS,
    LOC_PEDIDO,
    VERSAOCARTAO,
    ESTADOCARTAO,
    DATVALIDAD,
    ALTURA,
    DTHRPRT,
    DHPRINT,
    CCUSTOS)
  VALUES (
    :PESSOA_ID,
    :TITULO_ID,
    :APELIDO,
    :NOME,
    :TIPO_ID,
    :NOBI,
    :ARQIDENT,
    :DATEMIBI,
    :SEXO,
    :ESTCIVIL,
    :DAT_NASC,
    :NIF,
    :RFEMIT_NIF,
    :DATNIF,
    :NOSEGSOCIAL,
    :RFEMIT_SEGSOC,
    :DATSEGSOC,
    :CONCNASC_ID,
    :FREGNASC_ID,
    :PROFISSO_ID,
    :EMPRESA_ID,
    :RELACAO_ID,
    :ENTMST_ID,
    :SITUAC_ID,
    :SINDICATO_ID,
    :ILHA_ID,
    :NASC_RES,
    :USERID,
    :ESTACAO,
    :"DATA",
    :HORA,
    :SITU,
    :ACCAO,
    :DEPENDE_ID,
    :DD,
    :CC,
    :FF,
    :DATA_C,
    :NOBI12,
    :NACIONALIDADE,
    :NMPAI,
    :INDEVTPAI,
    :NMMAE,
    :INDEVTMAE,
    :NUTSNS,
    :LOC_PEDIDO,
    :VERSAOCARTAO,
    :ESTADOCARTAO,
    :DATVALIDAD,
    :ALTURA,
    :DTHRPRT,
    :DHPRINT,
    :CCUSTOS);


END;

Gladiston você usa por exemplo para fazer UPDATE/INSERT da Tabela "interna"
a partir da consulta da tabela "Externa"
Já experimentou alguma destas dificuldades de que falo acima. Obrigado
Abraço

Com os meus melhores cumprimentos
Mário Agostinho Reis
919262146

Esta mensagem contém informação de natureza confidencial e é
exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
receber este email agradecemos que não o copie nem o reenvie e que nos
notifique do ocorrido através do email de resposta.


Mário Reis <mariodosreyx em gmail.com> escreveu no dia sexta, 22/09/2023 à(s)
14:57:

> Gladiston
> Boas tardes
> Não será exactamente assim! Estou a fazer testes e dentro do bloco o FB vê
> a mesma tabela
> a gente precisa ter como dar um alias à external database e outro a
> Internal
> para fazer por exemplo *A.*externaldabase.Pessoas....          *B.*InternalDataBase.Pessoas
>  (acho que já vi isto assim, não lembro mais se MySql ou se IBM DB2
> FOR
>    EXECUTE STATEMENT
>       ( :sSql )
>       ON EXTERNAL DATA SOURCE :sDB
>       AS USER :IN_USER PASSWORD :IN_PWD -- just for example
>       WITH *common* TRANSACTION -- note autonomous transaction
>       INTO :PESSOA_ID, :TITULO_ID, :APELIDO, :NOME, :TIPO_ID etc..
> Do Begin
> -- Fazer *aqui dentro deste bloco* e o firebird
> --tenta inserir na mesma database ou seja, na external database
> --quando o que eu preciso é inserir na base de dados corrente
> -- Seja como COMMON ou AUTONOMUS Transaction o resultado é o mesmo
> -- tenta introduzir na tabela pessoas da external database!!!
>  /*  INTERNAL DATA SOURCE */
> INSERT INTO PESSOAS (
>     PESSOA_ID,
>     TITULO_ID,
>     APELIDO,
>     NOME,
>     TIPO_ID)
> Values(
>     :PESSOA_ID,
>     :TITULO_ID,
>     :APELIDO,
>     :NOME,
>     :TIPO_ID)
> end
> Não sei ainda como resolver. Se criar uma nova Procedure de onde irei
> chamar esta e então quando voltar à primeira, fazer o INSERT.
> Todavia penso que vai ser um processo muito mais pesado digo demorado sem
> falar do trabalho (o copy paste) dos parâmetros hão-de ajudar!
> Talvez?!
>
> Com os meus melhores cumprimentos
> Mário Agostinho Reis
> 919262146
>
> Esta mensagem contém informação de natureza confidencial e é
> exclusivamente dirigida ao(s) destinatário(s) indicado(s). Se, por engano,
> receber este email agradecemos que não o copie nem o reenvie e que nos
> notifique do ocorrido através do email de resposta.
>
>
> Gladiston Santana <gladiston.santana em gmail.com> escreveu no dia sexta,
> 22/09/2023 à(s) 14:36:
>
>> Isso mesmo!
>> Ou antes do insert modificar os valores recebidos, recalcular e só então
>> aplicar o insert.
>>
>> Em qui., 21 de set. de 2023 às 21:51, Mário Reis <mariodosreyx em gmail.com>
>> escreveu:
>>
>>> Se não tem  outra forma de ir buscar dados a uma DB externa sem o
>>> "execute statement" o "For" vai fazer n' vezes tantas quantas verificarem a
>>> condição, certo? Então com o recurso a um Begin e antes do End posso fazer
>>> igual n⁰ insert INTO minha tabela.
>>> Compreendi bem? Obrigado
>>>
>>> A quinta, 21/09/2023, 19:14, Gladiston Santana <
>>> gladiston.santana em gmail.com> escreveu:
>>>
>>>> Saudações além-mar Mário,
>>>>
>>>> O suspend retorna uma linha de dados conforme o RETURNS indicado no
>>>> cabeçalho da procedure, então se você fizer uma procedure assim:
>>>> CREATE or alter PROCEDURE SP_ABOUT
>>>> RETURNS (
>>>>     NOME varchar(120),
>>>>     EMAIL varchar(255)
>>>>     )
>>>> AS
>>>> BEGIN
>>>>   NOME  = 'GLADISTON SANTANA';
>>>>   EMAIL = 'gladiston.santana [em] gmail.com';
>>>>   SUSPEND;
>>>> END
>>>>
>>>> Se fizer  SELECT * FROM SP_ABOUT irá retornar uma linha contendo NOME e
>>>> EMAIL, mas se voce apenas comentar o SUSPEND não irá retornar nada!
>>>> Quando voce usar um FOR...SELECT...DO, você esta experimentando ler uma
>>>> linha por vez do seu select, muita gente abriria após o DO um begin...end e
>>>> só faria o SUSPEND nas linhas que desejam ser retornadas, quando o camarada
>>>> não poe nenhum BEGIN/END e já faz um SUSPEND ele intenciona retornar todos.
>>>> O problema com o 'execute statement' é que a query deve ter os mesmos
>>>> parâmetros de entrada (select....) e saida( into xxx) e ainda por cima
>>>> corresponder a cada RETURNS do cabeçalho da procedure. Quanto mais campos
>>>> indicar, maiores as chances de errar. Quando eu faço o que você está
>>>> fazendo, eu idento linha-a-linha e confiro as correspondências no INTO e
>>>> RETURNS pq é complicado enxergar erro de sintaxe na sequência.
>>>>
>>>> []´s
>>>>
>>>
>>
>> --
>> Gladiston Santana
>> Escritório: 4787-3122 Ramal 228
>> Cel Tim/WhatsApp: (11)95144-8188
>>
>


Mais detalhes sobre a lista de discussão lista