Tempo aproximado para lectura: 00:05:00 min
Duda
Ejemplo de ExecAuto para la alteración de Reservas Múltiples (MATA381)
Ambiente
Cross Segmentos - TOTVS Backoffice (Línea Protheus) - MI - Stock y Costos (SIGAEST) - Todas las versiones 12
Solución
Para cambiar la información de la tabla SDC que está vinculada al compromiso, se deben utilizar los identificadores LINPOS y AUTDELETA de la misma forma que se utiliza para los registros de la tabla SD4.
Para agregar un nuevo compromiso, simplemente agregue la información sobre este nuevo compromiso a la matriz de elementos.
Para cambiar compromisos, envíe el tercer parámetro de MATA381 con el valor 4.
Ejemplo de compromisos cambiantes
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
User Function Alt381Auto() Local nX := 0 Local aCab := {} Local aLine := {} Local aItens := {} Local aLineEnder := {} Local aEnder := {} PRIVATE lMsErroAuto := .F. //Monta o cabeçalho com o número da OP que será alterada. //Necessário utilizar o índice 2 para efetuar a alteração. aCab := {{"D4_OP","00130301001",NIL},; {"INDEX",2,Nil}} //Seta o índice da SDC SDC->(dbSetOrder(2)) //Busca os empenhos da SD4 para alterar/excluir. SD4->(dbSetOrder(2)) SD4->(dbSeek(xFilial("SD4")+PadR("00130301001",Len(SD4->D4_OP)))) While SD4->(!Eof()) .And. SD4->(D4_FILIAL+D4_OP) == xFilial("SD4")+PadR("00130301001",Len(SD4->D4_OP)) //Adiciona as informações do empenho, conforme estão na tabela SD4. aLine := {} For nX := 1 To SD4->(FCount()) aAdd(aLine,{SD4->(Field(nX)),SD4->(FieldGet(nX)),Nil}) Next nX //Adiciona o identificador LINPOS para identificar que o registro já existe na SD4 aAdd(aLine,{"LINPOS","D4_COD+D4_TRT+D4_LOTECTL+D4_NUMLOTE+D4_LOCAL+D4_OPORIG+D4_SEQ",; SD4->D4_COD,; SD4->D4_TRT,; SD4->D4_LOTECTL,; SD4->D4_NUMLOTE,; SD4->D4_LOCAL,; SD4->D4_OPORIG,; SD4->D4_SEQ}) //Marca o empenho do produto "MP" como Excluído. If AllTrim(SD4->D4_COD) == "MP01" aAdd(aLine,{"AUTDELETA","S",Nil}) ElseIf AllTrim(SD4->D4_COD) == "MP02" //Altera a quantidade do empenho do produto "9617-MP1" //Busca a informação da quantidade (D4_QTDEORI) no array aLine. nX := aScan(aLine,{|x| x[1] == "D4_QTDEORI"}) If nX > 0 //Encontrou o valor da quantidade. Faz a alteração do valor. aLine[nX,2] := 10 EndIf //Altera também o saldo do empenho nX := aScan(aLine,{|x| x[1] == "D4_QUANT"}) If nX > 0 //Encontrou o valor da quantidade. Faz a alteração do valor. aLine[nX,2] := 10 EndIf //Altera também o lote do empenho nX := aScan(aLine,{|x| x[1] == "D4_LOTECTL"}) If nX > 0 //Encontrou o valor da quantidade. Faz a alteração do valor. aLine[nX,2] := "LOTE1" EndIf ElseIf AllTrim(SD4->D4_COD) == "MP03" //Altera os endereços utilizado no empenho do produto "9617-MP2" //Primeiro carrega os endereços utilizados. If SDC->(dbSeek(xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE))) //Inicializa o array aEnder aEnder := {} //Busca os registros da tabela SDC While SDC->(!Eof()) .And. ; xFilial("SDC")+SD4->(D4_COD+D4_LOCAL+D4_OP+D4_TRT+D4_LOTECTL+D4_NUMLOTE) == ; SDC->(DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT+DC_LOTECTL+DC_NUMLOTE) //Inicializa o array aLineEnder aLineEnder := {} //Carrega as informações da tabela SDC no array aLineEnder For nX := 1 To SDC->(FCount()) aAdd(aLineEnder,{SDC->(Field(nX)),SDC->(FieldGet(nX)),Nil}) Next nX //Adiciona o identificador LINPOS para identificar que o registro já existe na tabela SDC aAdd(aLineEnder,{"LINPOS","DC_LOCALIZ+DC_NUMSERI",; SDC->DC_LOCALIZ,; SDC->DC_NUMSERI}) //Verifica se é o endereço "END". Se for, marca a linha para exclusão. If AllTrim(SDC->DC_LOCALIZ) == "END01" aAdd(aLineEnder,{"AUTDELETA","S",NIL}) ElseIf AllTrim(SDC->DC_LOCALIZ) == "END02" //Verifica se é o endereço "END02". Se for, altera a quantidade. //Busca a posição em que a quantidade está no array aLineEnder. nX := aScan(aLineEnder,{|x| x[1] == "DC_QUANT"}) If nX > 0 //Encontrou a quantidade no array aLineEnder. Faz a alteração da quantidade. aLineEnder[nX,2] := 8 EndIf EndIf //Adiciona o endereço no array de endereços. aAdd(aEnder,aLineEnder) //Próximo registro da SDC SDC->(dbSkip()) End //Adiciona um novo endereço para ser incluído na tabela SDC. //Inicializa o array aLineEnder aLineEnder := {} //Adiciona as informações do novo endereço. aAdd(aLineEnder,{"DC_LOCALIZ","END03",Nil}) aAdd(aLineEnder,{"DC_QUANT" ,2 ,Nil}) //Adiciona o novo endereço no array de endereços. aAdd(aEnder,aLineEnder) //Adiciona as informações de alteração de endereço no array do Empenho. aAdd(aLine,{"AUT_D4_END",aEnder,Nil}) EndIf EndIf //Adiciona as informações do empenho no array de itens. aAdd(aItens,aLine) //Próximo registro da SD4. SD4->(dbSkip()) End //Adiciona um novo empenho aLine := {} aAdd(aLine,{"D4_OP" ,"00130301001" ,NIL}) aAdd(aLine,{"D4_COD" ,"MP04" ,NIL}) aAdd(aLine,{"D4_LOCAL" ,"01" ,NIL}) aAdd(aLine,{"D4_DATA" ,CtoD("17/09/2018"),NIL}) aAdd(aLine,{"D4_QTDEORI",5 ,NIL}) aAdd(aLine,{"D4_QUANT" ,5 ,NIL}) aAdd(aLine,{"D4_LOTECTL","L1" ,NIL}) aAdd(aLine,{"D4_TRT" ,"004" ,NIL}) aAdd(aLine,{"D4_ROTEIRO","01" ,NIL}) aAdd(aItens,aLine) //Executa o MATA381, com a operação de Alteração. MSExecAuto({|x,y,z| mata381(x,y,z)},aCab,aItens,4) If lMsErroAuto //Se ocorrer erro. MostraErro() Else Alert("Alterado com sucesso.") EndIfReturn |
0 Comentarios