Fórum Dados de um form para o outro.... #326381
28/07/2006
0
[img]
[URL=http://img48.imageshack.us/my.php?image=imagemsb3.jpg][img:78457d7687]http://img48.imageshack.us/img48/9836/imagemsb3.th.jpg[/img:78457d7687][/URL]
[/img]
por exemplo quando tenho que dar baixa eu uso um código que busca o os dados no primeiro form, já ví em alguns fóruns que este procedimento num seria legal...e de fato de vez em quanto dá algun erro nesta parte do programa e tem vez que funciona...queria saber a opinião de vc´s qual seria o melhor método para isso...vlw t+ galera..
Gigatel
Curtir tópico
+ 0Posts
28/07/2006
Paullsoftware
Gostei + 0
28/07/2006
Gigatel
por exemplo veja este código..
procedure T_FORM_OS_BX.Button4Click(Sender: TObject); var a,b,c : real; r:integer; g: string; begin if DBLookupComboBox1.Text = ´´ then begin Showmessage (´É obrigatório seu prenchimento campo "Responsável"´); abort; end else begin QRLabel31.Caption := ´R$ ´+ _FORM_OS_NAV.BD_OFC_ELEGS_OOE_VALOR_TOT.Value; QuickRep1.PrinterSettings.Copies := BD_CONFOSGS_OOC_QDFIB.value; if Application.MessageBox(PAnsiChar(´Deseja dar saída a O.S. do cliente ´+_FORM_OS_NAV.BD_OFC_ELEGS_OOE_NOME.AsString+ ´ ?´), ´Pergunta´, MB_ICONQUESTION + MB_YESNO) <> IDYES then Abort; BD_AM_OSOE.Insert; BD_AM_OSOEGS_AMOOEI_CON_SAIDA.Value := ´ Consertado´; BD_AM_OSOEGS_AMOOEI_USU_LOG.Value:= _FORM_PRINCIPAL .StatusBar.Panels[2].text; BD_AM_OSOEGS_AMOOEI_END.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_END.Value; BD_AM_OSOEGS_AMOOEI_COMP.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_COMP.Value; BD_AM_OSOEGS_AMOOEI_BAIRRO.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_BAIRRO.Value; BD_AM_OSOEGS_AMOOEI_CIDADE.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_CIDADE.Value; BD_AM_OSOEGS_AMOOEI_CEP.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_CEP.Value; BD_AM_OSOEGS_AMOOEI_SOLUCAO.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_SOLUCAO.Value; BD_AM_OSOEGS_AMOOEI_TEL_01.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TEL_01.Value; BD_AM_OSOEGS_AMOOEI_TEL_02.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TEL_02.Value; BD_AM_OSOEGS_AMOOEI_TEL_03.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TEL_03.Value; BD_AM_OSOEGS_AMOOEI_TEL_04.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TEL_04.Value; BD_AM_OSOEGS_AMOOEI_ACESSORIOS.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_ACESSORIOS.Value; BD_AM_OSOEGS_AMOOEI_DEF_ALEGADO.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_DEF_ALEGADO.Value; BD_AM_OSOEGS_AMOOEI_TIPCONSERTO.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TIPCONSERTO.Value; BD_AM_OSOEGS_AMOOEI_APROVSN.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_APROVSN.Value; BD_AM_OSOEGS_AMOOEI_DATA_AGE.Value := StrToDate(FormatDateTime(´dd/mm/yyyy´,Date)); BD_AM_OSOEGS_AMOOEI_HORA_ENT.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TIPCONSERTO.Value; BD_AM_OSOEGS_AMOOEI_UF.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_UF.Value; BD_AM_OSOEGS_AMOOEI_EMAIL.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_EMAIL.Value; BD_AM_OSOEGS_AMOOEI_NOME.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_NOME.Value; BD_AM_OSOEGS_AMOOEI_CODACES.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_CODACES.Value; BD_AM_OSOEGS_AMOOEI_DATA_ENT.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_DATA_ENT.Value; BD_AM_OSOEGS_AMOOEI_DATA_ORC.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_DATA_ORC.Value; BD_AM_OSOEGS_AMOOEI_VALOR_TOT.Value := Edit3.Text; BD_AM_OSOEGS_AMOOEI_APDESCR.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_APDESCR.Value; BD_AM_OSOEGS_AMOOEI_DEF_ALEGADO.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_DEF_ALEGADO.Value; BD_AM_OSOEGS_AMOOEI_MARCA.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_MARCA.Value; BD_AM_OSOEGS_AMOOEI_MODELO.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_MODELO.Value; BD_AM_OSOEGS_AMOOEI_NSERIE.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_NSERIE.Value; BD_AM_OSOEGS_AMOOEI_DATA_ORC.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_DATA_ENT.Value; BD_AM_OSOEGS_AMOOEI_DATA_SAI.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_DATA_SAI.Value; BD_AM_OSOEGS_AMOOEI_CODIGO_OS.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_CODIGO.Value; BD_AM_OSOEGS_AMOOEI_TEC_RESP.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_TEC_RESP.Value; BD_AM_OSOE.Post; BD_CAIXA.Insert; BD_CAIXAGS_CX_DESCRICAO.Value := ´Manutenção´; BD_CAIXAGS_CX_NATUREZA.Value := ´Valor recebido ref. a O.S. de Nº´+ label27.Caption; BD_CAIXAGS_CX_CRE_DEB.Value := ´C´; BD_CAIXAGS_CX_DATA.Value := StrToDate(FormatDateTime(´dd/mm/yyyy´,Date)); BD_CAIXAGS_CX_COD_ORIGEM.Value := label27.Caption; BD_CAIXAGS_CX_VALOR_MOVIMENTO.Value := Label17.Caption; BD_CAIXAGS_CX_USU_LOG.Value := _FORM_PRINCIPAL.StatusBar.Panels[2].text; BD_CAIXAGS_CX_CODACESS.Value := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_CODACES.Value; BD_CAIXA.Post; a:=strtofloat(edit3.text); b:=strtofloat(_FORM_OS_NAV.BD_OFC_ELEGS_OOE_VALOR_TOT.Value); c:= b-a ; QRLabel5.Caption := ´R$ ´+ floattostrf(c,ffFixed,10,2); QRLabel7.Caption := ´R$ ´+ Edit3.Text; QRLabel34.Caption := _FORM_OS_NAV.BD_OFC_ELEGS_OOE_NOME.Value; r:= _FORM_OS_NAV.BD_OFC_ELEGS_OOE_CODIGO.Value; g:=format(´¬5.5d´,[r]); QRLabel16.Caption:= g; with BD_ORCA_ITENS do begin First; Try while not BD_ORCA_ITENS.eof do begin BD_ESTOQUE.Close; BD_ESTOQUE.SQL.Clear; BD_ESTOQUE.SQL.Add(´select * from ESTOQUE where GS_EST_CODIGO=´+inttostr(BD_ORCA_ITENSGS_OOEI_CODPROD.Value)); BD_ESTOQUE.Open; BD_ESTOQUE.Edit; if not BD_ORCA_ITENSGS_OOEI_CODPROD.IsNull then begin BD_ESTOQUEGS_EST_QNT.Value := BD_ESTOQUEGS_EST_QNT.Value - BD_ORCA_ITENSGS_OOEI_QNT.Value; BD_ESTOQUE.Post; BD_ORCA_ITENS.next; end else BD_ORCA_ITENS.next; end; DM1.IBTransaction1.CommitRetaining; except showmessage(´Problema com o banco de dados.´); DM1.IBTransaction1.rollback; end; end; if Application.MessageBox(´Imprimir documento de saida ?´ , ´Imprimir´, MB_ICONQUESTION + MB_YESNO) = IDYES then QuickRep1.Print; BD_ORCA_ITENS.First; while not BD_ORCA_ITENS.Eof do BD_ORCA_ITENS.Delete; _FORM_OS_NAV.BD_OFC_ELE.Delete; Close; end; end;
tenho que pegar informações de um outro form e isso está gerando defeitos intermitentes...
Gostei + 0
29/07/2006
Marco Salles
:?: :?: :?: :?:
Voltando a questão
Porque voce fez :
except showmessage(´Problema com o banco de dados.´); DM1.IBTransaction1.rollback;
[b:547f21bbdc]não esta faltando um Begin End nesta instrução ????[/b:547f21bbdc]
except
begin
showmessage(´Problema com o banco de dados.´);
DM1.IBTransaction1.rollback;
end;
[b:547f21bbdc]Do jeito que esta , voce esta sempre dando um Roolback no seu banco , independentemente de ter ou não uma exceção[/b:547f21bbdc]
[b:547f21bbdc]Segundo ponto : Tente deburgar com BreakPoint , para dar uma idéia do tipo de erro que aparece.. Aonde e qual linha [/b:547f21bbdc]
Quando a usar dados de outros formulários , vejo aqui que voce usa valores de Outros dadaSets e do Formulário Principal... O que se faz normalmente é concentrar os[b:547f21bbdc] DataSet em DataModulos [/b:547f21bbdc].
:arrow: :arrow:
Fica mais fácila manutenção e o entendimento , alem de ter que ficar criando e destruindo Formulários toda vez que precissar acessar alguns dados de alguns dataSets.
Gostei + 0
29/07/2006
Micheus
except showmessage(´Problema com o banco de dados.´); DM1.IBTransaction1.rollback;
[b:aff8e45dee]Marco Salles[/b:aff8e45dee], não querendo ´mudar o rumo da prosa´, mas até onde eu sabia (ou pensava saber), quando uma exceção ocorre, tudo que estiver entre o [i:aff8e45dee]Except...End[/i:aff8e45dee] é executado (salvo se introduzida alguma função de desvio). Exceto no caso de vc tratar várias classes de exceção onde vc utiliza:
... except On Classe_Erro Do [Begin] Instrução[ões] [End;] ... end;
Um uso comum, inclusive, que faço da situação em questão é:
try ... except Comp_Name.SetFocus; ShowMessage(´O campo ... deve ser informado.´); end;
Bom, utilizo D7, não sei como andam as versões mais recentes. :?:
Gostei + 0
29/07/2006
Marco Salles
o tratamento de exceçoes é muito menos importante do que usar os blocos Try Finally, porque o delphi pode sobreviver a maioria das exceções. O Correto num programa é ter muitos blocos Try Finally , algumas instruçoes Raises e quase nenhum Bloco Try Except.
foi isso que imaginei , mas voce chamou corretamente a atençao , que ele nao faz nenhum tratamento especial a nenhuma classe.. Então , desconsidere a minha observação e muito obrigado pela sua correta
participação.
Comecei no delphi 5.0 e ja era assim.
Gostei + 0
29/07/2006
Marco Salles
Vamos supor que uma [b:d6991a6deb]exceção é disparada [/b:d6991a6deb].. Com foi colocado anteriormente , Tudo que esta abaixo do Exception end é executado.
[b:d6991a6deb]Mas e o Resto ????[/b:d6991a6deb] :?: :?: :?:
[b:d6991a6deb]Acho[/b:d6991a6deb] que , mesmo que ocorra uma exceção , ou dependendo do tipo , o Resto da Instrução [b:d6991a6deb]tb será executada [/b:d6991a6deb].... A pergunta que faço é :
[b:d6991a6deb]Esta correto , ocorrendo a exceção , Imprimir o Documento de Saida ????[/b:d6991a6deb]
Gostei + 0
09/08/2006
Gigatel
Gostei + 0
09/08/2006
Gigatel
Pode até dar alguma coiza errada, más estou usando desde do dia em que consertei o programa ( um dia depois de postar este tópico ), e tenho usado sem nenhum problema, más se foi detectado um problema no código por que não corrigi-lo... segue código que uso atualmente...vlw t+..
procedure T_FORM_OS_BX.Button4Click(Sender: TObject); var a,b,c : real; r:integer; g: string; begin if DBLookupComboBox1.Text = ´´ then begin Showmessage (´É obrigatório seu prenchimento campo "Responsável"´); abort; end else begin QRLabel31.Caption := ´R$ ´+ BD_OFC_ELEGS_OOE_VALOR_TOT.Value; QuickRep1.PrinterSettings.Copies := BD_CONFOSGS_OOC_QDFIB.value; if Application.MessageBox(PAnsiChar(´Deseja dar saída a O.S. do cliente ´+BD_OFC_ELEGS_OOE_NOME.AsString+ ´ ?´), ´Pergunta´, MB_ICONQUESTION + MB_YESNO) <> IDYES then Abort; BD_AM_OSOE.Insert; BD_AM_OSOEGS_AMOOEI_CON_SAIDA.Value := ´ Consertado´; BD_AM_OSOEGS_AMOOEI_USU_LOG.Value:= _FORM_PRINCIPAL .StatusBar.Panels[2].text; BD_AM_OSOEGS_AMOOEI_END.Value := BD_OFC_ELEGS_OOE_END.Value; BD_AM_OSOEGS_AMOOEI_COMP.Value := BD_OFC_ELEGS_OOE_COMP.Value; BD_AM_OSOEGS_AMOOEI_BAIRRO.Value := BD_OFC_ELEGS_OOE_BAIRRO.Value; BD_AM_OSOEGS_AMOOEI_CIDADE.Value := BD_OFC_ELEGS_OOE_CIDADE.Value; BD_AM_OSOEGS_AMOOEI_CEP.Value := BD_OFC_ELEGS_OOE_CEP.Value; BD_AM_OSOEGS_AMOOEI_SOLUCAO.Value := BD_OFC_ELEGS_OOE_SOLUCAO.Value; BD_AM_OSOEGS_AMOOEI_TEL_01.Value := BD_OFC_ELEGS_OOE_TEL_01.Value; BD_AM_OSOEGS_AMOOEI_TEL_02.Value := BD_OFC_ELEGS_OOE_TEL_02.Value; BD_AM_OSOEGS_AMOOEI_TEL_03.Value := BD_OFC_ELEGS_OOE_TEL_03.Value; BD_AM_OSOEGS_AMOOEI_TEL_04.Value := BD_OFC_ELEGS_OOE_TEL_04.Value; BD_AM_OSOEGS_AMOOEI_ACESSORIOS.Value := BD_OFC_ELEGS_OOE_ACESSORIOS.Value; BD_AM_OSOEGS_AMOOEI_DEF_ALEGADO.Value := BD_OFC_ELEGS_OOE_DEF_ALEGADO.Value; BD_AM_OSOEGS_AMOOEI_TIPCONSERTO.Value := BD_OFC_ELEGS_OOE_TIPCONSERTO.Value; BD_AM_OSOEGS_AMOOEI_APROVSN.Value := BD_OFC_ELEGS_OOE_APROVSN.Value; BD_AM_OSOEGS_AMOOEI_DATA_AGE.Value := StrToDate(FormatDateTime(´dd/mm/yyyy´,Date)); BD_AM_OSOEGS_AMOOEI_HORA_ENT.Value := BD_OFC_ELEGS_OOE_TIPCONSERTO.Value; BD_AM_OSOEGS_AMOOEI_UF.Value := BD_OFC_ELEGS_OOE_UF.Value; BD_AM_OSOEGS_AMOOEI_EMAIL.Value := BD_OFC_ELEGS_OOE_EMAIL.Value; BD_AM_OSOEGS_AMOOEI_NOME.Value := BD_OFC_ELEGS_OOE_NOME.Value; BD_AM_OSOEGS_AMOOEI_CODACES.Value := BD_OFC_ELEGS_OOE_CODACES.Value; BD_AM_OSOEGS_AMOOEI_DATA_ENT.Value := BD_OFC_ELEGS_OOE_DATA_ENT.Value; BD_AM_OSOEGS_AMOOEI_DATA_ORC.Value := BD_OFC_ELEGS_OOE_DATA_ORC.Value; BD_AM_OSOEGS_AMOOEI_VALOR_TOT.Value := Label17.Caption; BD_AM_OSOEGS_AMOOEI_APDESCR.Value := BD_OFC_ELEGS_OOE_APDESCR.Value; BD_AM_OSOEGS_AMOOEI_DEF_ALEGADO.Value := BD_OFC_ELEGS_OOE_DEF_ALEGADO.Value; BD_AM_OSOEGS_AMOOEI_MARCA.Value := BD_OFC_ELEGS_OOE_MARCA.Value; BD_AM_OSOEGS_AMOOEI_MODELO.Value := BD_OFC_ELEGS_OOE_MODELO.Value; BD_AM_OSOEGS_AMOOEI_NSERIE.Value := BD_OFC_ELEGS_OOE_NSERIE.Value; BD_AM_OSOEGS_AMOOEI_DATA_ORC.Value := BD_OFC_ELEGS_OOE_DATA_ENT.Value; BD_AM_OSOEGS_AMOOEI_DATA_SAI.Value := BD_OFC_ELEGS_OOE_DATA_SAI.Value; BD_AM_OSOEGS_AMOOEI_CODIGO_OS.Value := BD_OFC_ELEGS_OOE_CODIGO.Value; BD_AM_OSOEGS_AMOOEI_TEC_RESP.Value := BD_OFC_ELEGS_OOE_TEC_RESP.Value; BD_AM_OSOE.Post; BD_CAIXA.Insert; BD_CAIXAGS_CX_DESCRICAO.Value := ´Manutenção´; BD_CAIXAGS_CX_NATUREZA.Value := ´Valor recebido ref. a O.S. de Nº´+ label27.Caption; BD_CAIXAGS_CX_CRE_DEB.Value := ´C´; BD_CAIXAGS_CX_DATA.Value := StrToDate(FormatDateTime(´dd/mm/yyyy´,Date)); BD_CAIXAGS_CX_COD_ORIGEM.Value := label27.Caption; BD_CAIXAGS_CX_VALOR_MOVIMENTO.Value := Label17.Caption; BD_CAIXAGS_CX_USU_LOG.Value := _FORM_PRINCIPAL.StatusBar.Panels[2].text; BD_CAIXAGS_CX_CODACESS.Value := BD_OFC_ELEGS_OOE_CODACES.Value; BD_CAIXA.Post; a:=strtofloat(edit3.text); b:=strtofloat(BD_OFC_ELEGS_OOE_VALOR_TOT.Value); c:= b-a ; QRLabel5.Caption := ´R$ ´+ floattostrf(c,ffFixed,10,2); QRLabel7.Caption := ´R$ ´+ Label17.Caption; QRLabel34.Caption := BD_OFC_ELEGS_OOE_NOME.Value; r:= BD_OFC_ELEGS_OOE_CODIGO.Value; g:=format(´¬5.5d´,[r]); QRLabel16.Caption:= g; with BD_ORCA_ITENS do begin First; Try while not BD_ORCA_ITENS.eof do begin BD_ESTOQUE.Close; BD_ESTOQUE.SQL.Clear; BD_ESTOQUE.SQL.Add(´select * from ESTOQUE where GS_EST_CODIGO=´+inttostr(BD_ORCA_ITENSGS_OOEI_CODPROD.Value)); BD_ESTOQUE.Open; BD_ESTOQUE.Edit; if not BD_ORCA_ITENSGS_OOEI_CODPROD.IsNull then begin BD_ESTOQUEGS_EST_QNT.Value := BD_ESTOQUEGS_EST_QNT.Value - BD_ORCA_ITENSGS_OOEI_QNT.Value; BD_ESTOQUE.Post; BD_ORCA_ITENS.next; end else BD_ORCA_ITENS.next; end; DM1.IBTransaction1.CommitRetaining; except showmessage(´Problema com o banco de dados.´); DM1.IBTransaction1.rollback; end; end; if Application.MessageBox(´Imprimir documento de saida ?´ , ´Imprimir´, MB_ICONQUESTION + MB_YESNO) = IDYES then QuickRep1.Print; BD_ORCA_ITENS.First; while not BD_ORCA_ITENS.Eof do BD_ORCA_ITENS.Delete; _FORM_OS_NAV.BD_OFC_ELE.Delete; if _FORM_OS_NAV <> nil then begin _FORM_OS_NAV.BD_OFC_ELE.Close; _FORM_OS_NAV.BD_OFC_ELE.Open; _FORM_OS_NAV.BD_OFC_ELE.Refresh; end; Close; end; end;
fuiiiiiiiiiii
Gostei + 0
09/08/2006
Marco Salles
[b:81f021ed2d]acho voce deve usar dois blocos try aninhados[/b:81f021ed2d]
try //--->>dois blocos try aninhados Try erro:=False; while not BD_ORCA_ITENS.eof do begin BD_ESTOQUE.Close; BD_ESTOQUE.SQL.Clear; BD_ESTOQUE.SQL.Add(´select * from ESTOQUE where GS_EST_CODIGO=´+inttostr(BD_ORCA_ITENSGS_OOEI_CODPROD.Value)); BD_ESTOQUE.Open; BD_ESTOQUE.Edit; if not BD_ORCA_ITENSGS_OOEI_CODPROD.IsNull then begin BD_ESTOQUEGS_EST_QNT.Value := BD_ESTOQUEGS_EST_QNT.Value - BD_ORCA_ITENSGS_OOEI_QNT.Value; BD_ESTOQUE.Post; BD_ORCA_ITENS.next; end else BD_ORCA_ITENS.next; end; DM1.IBTransaction1.CommitRetaining; except erro:=True; showmessage(´Problema com o banco de dados.´); DM1.IBTransaction1.rollback; end; end; finally //--->coloque aqui o finally if erro Then //se for gerado uma exceção benhuma pergunta sera feit abort else // so ira fazer a pergunta se nenhuma exceção foi levantada if Application.MessageBox(´Imprimir documento de saida ?´ , ´Imprimir´, MB_ICONQUESTION + MB_YESNO) = IDYES then QuickRep1.Print; BD_ORCA_ITENS.First; while not BD_ORCA_ITENS.Eof do BD_ORCA_ITENS.Delete; _FORM_OS_NAV.BD_OFC_ELE.Delete; if _FORM_OS_NAV <> nil then begin _FORM_OS_NAV.BD_OFC_ELE.Close; _FORM_OS_NAV.BD_OFC_ELE.Open; _ FORM_OS_NAV.BD_OFC_ELE.Refresh; end; Close; end; //--->>>fim do Finally end;
se não errei nenhum begin end , acho que é isto ai ..
Gostei + 0
15/08/2006
Gigatel
Gostei + 0
15/08/2006
Gigatel
Gostei + 0
16/08/2006
Marco Salles
é a [b:5274248218]inicialização[/b:5274248218] da variavel.... Se tudo ocorrer bem , esta variavel [b:5274248218]não [/b:5274248218]muda de valor... ela so ira mudar de valor se uma [b:5274248218]exceção[/b:5274248218] for lançada . nesse caso ´ela´ recebe o valor :=True
não vejo razão para isto.. e acho ate estranho... Mas sem conhecer profundamente o mecanismo e a logica envolvida fica dificil para mim opinar com mais enfâse...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)