|
Bem Vindo, Visitante
|
Todos os Fórums
ADVPL
|
Imprimir
Enviar Para um Amigo Precisa estar Logado
|
|
|
Assunto: |
MT010ALT |
|
Versão: |
12.1.27 |
|
Plataforma: |
Microsoft |
Complemento: |
|
|
DB: |
SQL Server |
Complemento: |
|
|
|
|
|
Mensagem do
GU_ZAMPIER
em 18/11/2021, 15:40 h
Local: SP Registro: 03/09/2018 Postagens: 34 |
Boa tarde,
Galera alguem tem um exemplo ou o proprio PE aonde tenha um Array que armazena as informações do cliente?
Estou querendo fazer o seguinte, quando o usuario alterar o cadastro do cliente disparar um e-mail mostrando como estava o cadastro do cliente e depois mostrar oque mudou.
Se alguem tiver um exemplo ou o proprio array do pe já iria me ajudar muito.
Obrigado. |
|
|
Mensagem do
TECLESOFT
em 18/11/2021, 16:07 h
Local: SP Registro: 24/04/2012 Postagens: 215 |
Eu usaria um DBStruct da sua SA1 e depois rodaria no array que esse DBStruct cria da sua SA1, usando macrosubstituição para popular os campos antes de alterar os dados, e depois que você montasse o array de alteração pegaria os campos dos dois arrays e mostrava.. Agora como é que você está pretendendo mostrar o antes e depois.. SA1 tem bastante campos.
|
|
|
Mensagem do
GU_ZAMPIER
em 18/11/2021, 16:12 h
Local: SP Registro: 03/09/2018 Postagens: 34 |
Então são apenas alguns campos que o diretor aqui quer, você teria algum exemplo de como fazer isso só para eu ter a noção ?
Obrigado |
|
|
Mensagem do
TECLESOFT
em 18/11/2021, 16:46 h
Local: SP Registro: 24/04/2012 Postagens: 215 |
Veja se te ajuda..
aEstrZLC := ZLC->(DbStruct())
For _cc := 1 To Len(aEstrZLC)
aAdd(aCposZLC,ZLC->(&(aEstrZLC[_cc,1])) )
Next
For _pp := 1 To Len(aEstrZLC)
If aEstrZLC[_pp,1] == "ZLC_ORIGEM"
ZLC->(&(aEstrZLC[_pp,1])) := "DESDOBRACAD"
ElseIf aEstrZLC[_pp,1] == "ZLC_HARDLD"
ZLC->(&(aEstrZLC[_pp,1])) := AllTrim(aCposZLC[_pp])
ElseIf aEstrZLC[_pp,1] == "ZLC_LCORIG"
ZLC->(&(aEstrZLC[_pp,1])) := ""
ElseIf aEstrZLC[_pp,1] == "ZLC_IDLICE"
ZLC->(&(aEstrZLC[_pp,1])) := ""
ElseIf aEstrZLC[_pp,1] == "ZLC_ORDEM"
ZLC->(&(aEstrZLC[_pp,1])) := ""
Else
ZLC->(&(aEstrZLC[_pp,1])) := aCposZLC[_pp]
EndIf
Next
Isso basicamente replica a estrutura de campos de uma tabela e depois popula com os dados e a outra parte do for eu deixei ai para vc ter uma idéia de como filtrar só os campos que vc quer enxergar na comparação para montar seu array final, pode até usar aDel se quiser reduzir até mesmo a matriz se achar melhor.
Enfim, eu tirei de um outro fonte aqui meu então se estiver fora de contexto releve.. mas a idéia seria essa mesmo.
Agora se foram POUCOS campos, acho que o mais simples para quem não tem muita nocão de programação seria simplesmente ir guardando o conteúdo do campo antes de começar a alteração dentro de um array ou até mesmo cada campo em uma variável separada mesmo, e depois mostrar isto em tela com Alert mesmo coisa simples...
|
|
|
Mensagem do
LCA.LEO
em 18/11/2021, 16:54 h
Local: PR Registro: 09/01/2020 Postagens: 25 |
Boa tarde,
Aqui na empresa nós usamos o MA030TOK para informar a alteração do cliente, porém utilizamos apenas para o campo Bloqueado.
Local _lRet := .T.
Local _cStOld := AllTrim(SA1->A1_MSBLQL)
Local _cStNew := AllTrim(M->A1_MSBLQL)
Local _cUsrAut := SuperGetMV("MV_XMA030T",.T.,"001151","001091")
Local _cChave := AllTrim(M->(A1_COD+A1_LOJA))
Local _cNome := AllTrim(M->(A1_NOME))
_cStOld pega o valor do campo
_cStNew pega o valor em memória
Com essas informações montamos o HTML e enviamos por e-mail.
Lè0 |
|
|
Mensagem do
GU_ZAMPIER
em 19/11/2021, 11:34 h
Local: SP Registro: 03/09/2018 Postagens: 34 |
Vou tentar fazer do seu jeito , são apenas 10 campos.
entre esses campos existe campos que criamos aqui na empresa, acredito que com isso que você me mandou eu consiga pegar uma base para tentar fazer, nunca usei o DBStruct ai to apanhando para ele mas vamo lá.
Obrigado pela ajuda. |
|
|
Mensagem do
TECLESOFT
em 19/11/2021, 12:26 h
Local: SP Registro: 24/04/2012 Postagens: 215 |
É assim mesmo.. ele é uma função poderosa aliada a macro-substituição então.. faz miséria.
Com poucas linhas você resolve problemas que outro programador faria uma infinidade de linhas com if‘s etc..
Vá sem pressa e entenda bem e verá que pode usar em muitas situações até mesmo para popular uma tabela onde qualquer um faria um reclok de linha a linha e o dbstruct te ajuda a economizar fonte.. é assim mesmo no começo já já pega a manhã e estará voando. |
|
|
Mensagem do
GU_ZAMPIER
em 19/11/2021, 12:48 h
Local: SP Registro: 03/09/2018 Postagens: 34 |
até consegui fazer o comecinho, tenta me ajudar por favor.
Exemplo eu quero pegar o nome fantasia , como esta atualmente e depois quando o usuario mudar é facil, é só pegar da SA1 mas eu não estou entendendo oq o Struct em si traz.
Ele traz o nome do campo, tamanho, tipo, mas no caso eu queria que trouxesse o que está atualmente salvo entendeu?
Estou seguindo igual você mandou só para entender depois eu edito de outra forma
abaixo está da forma q estou fazendo, mas assim ele está trazendo o nome do campo e não o que está salvo.
Private aStru := SA1->(DbStruct())
Private aTabCli:= {}
Private nX := 0
Private nI := 0
For nX := 1 to Len(aStru)
aadd (aTabCli,{ SA1->(aStru[nX,1])})
Next
For nI := 1 to len(aStru)
if aStru[nI,1]=="A1_NREDUZ"
SA1->(aStru[nI,1]) := aTabCli[nI]
EndIf
Next
|
|
|
Mensagem do
CDTORRE
em 19/11/2021, 13:18 h
Local: SP Registro: 28/04/2020 Postagens: 2 |
Boa tarde,
O parâmetro MV_HISTTAB, que alimenta a tabela AIF, não resolve o seu problema?
|
|
|
Mensagem do
TECLESOFT
em 19/11/2021, 13:30 h
Local: SP Registro: 24/04/2012 Postagens: 215 |
Pois bem.. é isso mesmo.. eu não irei montar o fonte para vc, sei da sua necessidade e vontade em entregar ao pessoal da empresa, mas vc precisa quebrar a cabeça que ai NUNCA mais esquecerá.
O dbstruct é isso mesmo, ele retorna uma matriz contendo exatamente a estrutura da tabela, então agora o que você precisa fazer é:
Rodar um for na matriz retornada da dbstruct e a cada passada do FOR você grava o conteúdo da linha atual da SA1.
Desta forma você estará PEGANDO TODOS os campos da SA1 e tacando dentro do array que a dbstruct retornou... Depois só você escolher qual campo de TODOS que já estão preenchidos quer mostrar..
no primeiro exemplo que te passei tem exatamente isto que acabei de citar aqui..
1 - Rodar o dbstruct para ele retornar a matriz de estrutura da SA1
2 - Rodar um for no len(da matriz que dbstruct retornou) e a cada passada do for você alimenta uma posição (campo) desta matriz com o resultado do campo da SA1 no momento
3 - Depois usa essa matriz já populada para pegar apenas os campos que você quer.ou se quiser matar logo no passo 2 mesmo se for um dos campos que você quer mostrar você já grava em outra matiz, matriz de campos que vc quer mostrar..
Veja se consegue ai.
Seu fonte tá quase lá.. só olha lá o meu exemplo inicial e debuga esse seu ai para saber se o trecho do fonte está fazendo o que você imaginou que ele iria fazer quando escreveu o trecho.
|
|
|
Mensagem do
TECLESOFT
em 19/11/2021, 13:40 h
Local: SP Registro: 24/04/2012 Postagens: 215 |
Olha ai.... o CDTORRE matou na veia.. eu mesmo não conhecia esse parametro.
MV_HISTTAB
|
|
|
Mensagem do
GU_ZAMPIER
em 19/11/2021, 14:25 h
Local: SP Registro: 03/09/2018 Postagens: 34 |
Caraca, também não tinha conhecimento sobre esse parametro, maaas só para aprender vou fazer do seu jeito tbm para entender como é o dbstruct.
Bom Muito Obrigado,agradeço demais pela força que vocês me deram. |
|
Para postar no Fórum você precisa efetuar o seu login ou se registrar
|
|