Buenas pessoal, ja faz muito tempo que nao posto nada, nao por nao ter o que postar, mas sim, por estar fazendo a graduacao na area e o tempo faltando aos montes.Hoje resolvi postar algo simples, mas que da muito trabalho aos programadores em iniciantes quando sem fala em "inserts" em tabelas relacionas.Um exemplo do que estou falando, e a simples acao de incluir o cabecalho de um pedido e obter o ID do mesmo para incluir seus itens. Ha programadores que utilizam uma tabela para estas duas acoes, mas no meu caso, sempre uso duas, das quais chamo de mestre x detalhe.Para dar um exemplo, e preciso criar um tabela simples. Segue o comando:Create table "Pedido"(ID_Pedido serial primary key, Total Numeric);Quando todo o processo e feito via banco de dados, ou seja, atraves de funcoes, podemos utilizar pelo menos duas opcoes para retornar este ID:1o Atraves de comando "nextval"create or replace function inserir_pedido1() returns integer as$$declare --Cria-se uma variavel para receber o valor "nextval" xID_Pedido Integer default 0;begin --Recuperando o ID via comando "nextval" xID_Pedido = nextval('"Pedido_id_pedido_seq"'); --Insert utilizando a variavel para gravar o ID na tabela mestre e retornar a --funcao para depois utilizar na inclusao dos itens. Insert Into "Pedido" (ID_Pedido, Total) Values( XID_Pedido, 1.5); --Retornando o valor do ID Return XID_Pedido;end;$$ language plpgsql;--Chamada da funcao que inclui o mestre do pedidoSelect inserir_pedido1();2o Atraves do comando "returning"create or replace function inserir_pedido2() returns integer as$$declare --Cria-se uma variavel para receber o valor "into" XID Integer;begin --Recuperando o ID via comando "returning" Insert Into "Pedido" (Total) Values(1.5) returning ID_Pedido into XID; return XID;end; $$ language plpgsql;--Chamada da funcao que inclui o mestre do pedidoSelect inserir_pedido2();A segunda opcao, e a mais ideal a ser usada, levando em conta, que ao mesmo tempo que se envia os dados via comando "insert", se recebe o valor "id" gravado pela "sequence" do banco, sem a necessidade de executar dois comandos, ou seja, abrir duas sessoes em vez de uma.O comando "returning" retorna o valor gerado pela "sequence" e gravado na tabela no campo primario. No exemplo anterior postado, eu mostro como fazer um calculo do digito verificador modulo10 do banco do brasil, e neste, mostro como e feito o calculo usando o modulo11. Essas duas funcoes, referente aos chamados DV(Digito Verificador), podem serem executadas sem nenhuma alteracao, pois, elas nao fazem referencia as tabelas do banco de dados, sao funcoes das quais chamo de "Genericas".CREATE OR REPLACE FUNCTION "TS_ParcelaBloquetoBancoBrasilModulo11"(xdocumento character varying) RETURNS character varying AS$BODY$declare XNumero Varchar; XNumeroOrg Varchar; XCont Integer; XParcial Integer; XDivisorM11 Integer; XResto Integer; XDigVerM11 Integer; XMultiplo Integer;begin /* Funcao responsavel por calcular o DV modulo 11 Esta informacao vai impressa no bloqueto */ --Pegando somente os numeros do documentos XNumeroOrg = regexp_replace(XDocumento, '[^[:digit:]]', '', 'g'); /* *** Calculando Modulo "11" *** */ XDivisorM11 = 2; XParcial = 0; XNumero = trim(XNumeroOrg); XCont = length(XNumero); loop --Pegando numero a numero e multiplicando por 2 a 9 e acumulando o resultado linha a linha if XDivisorM11 > 9 then XDivisorM11 = 2; end if; XParcial = XParcial + Cast(SubStr(trim(XNumero),XCont,1) as Integer) * XDivisorM11;