Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 88

#INCLUDE "CNTA200.

CH"
#INCLUDE "PROTHEUS.CH"

//Situacoes de contrato
#DEFINE DEF_SCANC "01" //Cancelado
#DEFINE DEF_SELAB "02" //Em Elaboracao
#DEFINE DEF_SEMIT "03" //Emitido
#DEFINE DEF_SAPRO "04" //Em Aprovacao
#DEFINE DEF_SVIGE "05" //Vigente
#DEFINE DEF_SPARA "06" //Paralisado
#DEFINE DEF_SSPAR "07" //Sol Fina.
#DEFINE DEF_SFINA "08" //Finalizado
#DEFINE DEF_SREVS "09" //Revisao
#DEFINE DEF_SREVD "10" //Revisado

//Transacoes
#DEFINE DEF_TRAINC "007"//Inclusao de Planilhas
#DEFINE DEF_TRAEDT "008"//Edicao de Planilhas
#DEFINE DEF_TRAEXC "009 "//Exclusao de Planilhas
#DEFINE DEF_TRAVIS "032"//Visualizacao de Planilhas

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CNTA200 � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Rotina de cadastro das planilhas de contrato ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CNTA200() ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � ExpA1 = Array Cabecalho para Rotina Automatica ���
��� � ExpA2 = Array Itens para Rotina Automatica ���
��� � ExpN2 = Opcao do aRotina para Rotina Automatica ���
��� � ExpC1 = Rotina que faz a chamada dessa funcao.
���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� ATUALIZACOES SOFRIDAS DESDE A CONSTRU � AO INICIAL. ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P r ogramador � Data � BOPS � Motivo da Alteracao
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Function CNTA200(xAutoCab,xAutoItens,nOpcAuto,cRotina)
Local cFiltro := ""
Local cCn200Fil := ""
Local aIndexCNA := {}

Private bFiltraBrw:= {|| Nil}


Private cCadastro := OemToAnsi(STR0001) //Cadastro de Caucoes
Private cEspctr := ""
Private aAutoCab := xAutoCab
Private aAutoItens:= xAutoItens
Private lC200Auto := (valType(xAutoCab) == "A" .And. valType(xAutoItens) == "A")
Private aRotina := MenuDef()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ajusta Dicionarios SX1 �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
AjustaSX1()

If !lC200Auto
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Filtra MBrowse �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200FIL")
cCn200Fil := ExecBlock("CN200FIL",.F.,.F.)
If ( ValType(cCn200Fil) == "C" ) .And. !Empty(cCn200Fil)
cFiltro := cCn200Fil
EndIf
EndIf
If !Empty(cFiltro)
bFiltraBrw := {|| FilBrowse("CNA",@aIndexCNA,@cFiltro) }
Eval(bFiltraBrw)
EndIf

mBrowse(6,1,22,75,"CNA")
Else

DEFAULT nOpcAuto := 3
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa rotina automatica �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
MBrowseAuto(nOpcAuto,Aclone(aAutoCab),"CNB")
EndIf

Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200Manut � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Rotina de manutencao do cadastro de planilhas ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200Manut(cExp01,nExp02,nExp03,lExp04,lExp05,aExp06,aExp07 � � �
��� � ,cExp08,cExp09,dExp10,dExp11) ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � cExp01 - Alias do arquivo ���
��� � nExp02 - Registro selecionado ���
��� � nExp03 - Opcao selecionada pelo usuario ���
��� � xExp04 -
���
��� � lExp05 - Exibe campos referentes a revisao do tipo reali. � � �
��� � lExp06 - Exibe campos referentes a revisao do tipo readq. � � �
��� � aExp07 - Array com os cabecalhos de planilhas ���
��� � aExp08 - Array com os itens das planilhas ���
��� � cExp09 - Codigo do contrato ���
��� � cExp10 - Numero de identificacao da planilha ���
��� � dExp11 - Data de inicio do contrato ���
��� � dExp12 - Data de termino do contrato ���
��� � aExp13 -
���
��� � lExp14 - Indica se o usuario podera VISUALIZAR a planilha � � �
��� � do contrato mesmo sem ter acesso ao mesmo. Esse
��� � parametro e enviado como .T. exclusivamente
��� � rotina de liberacao (MATA097) quando o
��� � do tipo CT (Contrato) e o Aprovador nao possui
��� � acesso ao contrato.
���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function
CN200Manut(cAlias,nReg,nOpc,xFiller,lReali,lReadq,aPlani,aPlIt,cContra,cPlani,dInic
io,dTermino,aHeaderPla,aRateio,lVisAprCt)
Local l200SCC := ExistBlock("CTA200SCC")
Local l200PLN := ExistBlock("CTA200PLN")
Local lRet := .T.
Local lC200Auto := ((Type("lC200Auto") == "L") .And. lC200Auto)
Local l200VLPLA := ExistBlock("CN200VLPLA")
Local lC200VlAt := ExistBlock("C200VLAT")

Local lRetVlPla := .T.


Local lRetVlAt := .F.
Local lCopia := .F.

Local aArea := GetArea()


Local aArea2 := {}
Local aCpoEnch := {}
Local aButtons := {}
Local aCpoN := {}//Campos Excluidos da Enchoice
Local aAlter := {}
Local aNAlter := {"CNB_UM"}
Local aAlterEdt := {"CNB_TE","CNB_TS"}
Local aLocais := CNAGWLoad(nOpc)

Local nA := 0
Local nPosCampo := 0
Local nOpca := 0
Local nTotCronog
Local nPos
Local nPlan
Local nx

Local oDlg
Local cFilCod
Local lPer := .F. // Alterar para .T. caso n � o tenha permiss � o para inserir
planilha

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Definicao de variaveis de tela �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Local aColsPla := {}
Local aSize := MsAdvSize(,.F.,430)
Local aObjects := {}
Local aPosObj := {}
Local nUsado := 0
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Walk-Thru �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Local cWhile := "" //Condicao While para montar o aCols
Local cSeek := ""

//Campos excluidos na montagem do aHeaderPla


Local aNoFields := {}
Local aRetPE := {}
Local aUsButtons := {}
Local aStruCNB := {}
Local lExiCop := (GetNewPar( "MV_CNEXCOP", "N" ) == "S")
Local bCondicao := {|| .T. }
Local cQuery := ""
Local lPrjCni := FindFunction("ValidaCNI") .And. ValidaCNI()
PRIVATE aRatPlan := {}

DEFAULT aRateio := {"VAZIO"}


DEFAULT aHeaderPla := {}

Private aTela := {}
Private aGets := {}
Private oGetDados

//Variaveis usadas pela consulta especifica


PRIVATE lContrEd := (aPlani != Nil)
PRIVATE lBxCNT := .F.
PRIVATE dCN9FIM := dTermino
PRIVATE aHeader := {}
PRIVATE aCols := {}
PRIVATE aRatAux := {}

Default lReali := .F.


Default lReadq := .F.
Default lVisAprCt := .F.

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ajusta Dicionarios SX3 �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
AjustaSX3()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ajusta Dicionarios SX7 �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
AjustaSX7()

if aRotina[nOpc,4] != 3 .And. aRotina[nOpc,4] != 2 .And. !lContrEd .And. !lC200Auto


lRet := CN240VldUsr(CNA->CNA_CONTRA,If(nOpc==4,DEF_TRAEDT,DEF_TRAEXC),.T.)

If lRet
dbSelectArea("CN9")
dbSetOrder(1)
dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)

// � Identifica tipo do contrato: compra/venda �


// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
cEspCtr := If(Empty(CN9->CN9_CLIENT),"1","2")
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ponto de entrada que permite a altera � � o da �
// � planilha com situa � � es diferentes de �
// � "elabora � � o". �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lC200VlAt
lRetVlAt := ExecBlock("C200VLAT",.F.,.F.,{CN9->CN9_SITUAC})
If ValType(lRetVlAt)<>"L"
lRetVlAt := .F.
EndIf
EndIf

If !lRetVlAt
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o contrato aceita exclusao/inclusao �
// � de planilhas �
// � - 2 - Elaboracao �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If AllTrim(CN9->CN9_SITUAC) != DEF_SELAB .AND. AllTrim(CN9-
>CN9_SITUAC) != DEF_SEMIT .AND. AllTrim(CN9->CN9_SITUAC) != DEF_SAPRO
Help(" ",1,"CNTA200SIT") //"Situa � � o de contrato inv � lida
para exc/inc de planilhas"
lRet := .F.
EndIF
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se a planilha possui cronograma e se �
// � o mesmo possui medicoes �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !Empty(CNA->CNA_CRONOG)
dbSelectArea("CNF")
dbSetOrder(1)

cFilCod := xFilial("CNF")
If dbSeek(cFilCod+CNA->CNA_CRONOG)

While CNF->CNF_FILIAL == cFilCod .And. CNF->CNF_NUMERO ==


CNA->CNA_CRONOG
If !Empty(CNF->CNF_DTREAL)
Help(" ",1,"CNTA200SEL") //"A planilha
selecionada n � o pode ser alterada/exclu � da pois possui medi � � e s j � efetuadas"
lRet := .F.
Exit
EndIf
dbSkip()
EndDo
EndIf
EndIf
EndIf
EndIF

If aRotina[nOpc,4] == 2
lRet := If(lContrEd,.T.,CN240VldUsr(CNA-
>CNA_CONTRA,DEF_TRAVIS,.T.,lVisAprCt))

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Identifica tipo do contrato: compra/venda �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lContrEd
CN1->(dbSetOrder(1))
CN1->(dbSeek(xFilial("CN1")+M->CN9_TPCTO))

cEspCtr := CN1->CN1_ESPCTR
Else
cEspCtr := If(Empty(CNA->CNA_CLIENT),"1","2")
EndIf

EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o usuario tem permissao de delecao. �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If nOpc == 5
If (VAL(GetVersao(.F.)) == 11 .And. GetRpoRelease() >= "R6" .Or.
VAL(GetVersao(.F.)) > 11) .And. FindFunction("MaAvalPerm")
aArea2 := GetArea()
CNB->(dbSeek(xFilial("CNB")+CNA->(CNA_CONTRA+CNA_REVISA+CNA_NUMERO)))
While !CNB->(Eof()) .And. lRet .And. xFilial("CNB")+CNA-
>(CNA_CONTRA+CNA_REVISA+CNA_NUMERO)==CNB-
>(CNB_FILIAL+CNB_CONTRA+CNB_REVISA+CNB_NUMERO)
lRet := MaAvalPerm(1,{CNB->CNB_PRODUT,"CNT200",5})
CNB->(dbSkip())
End
RestArea(aArea2)
If !lRet
Help(,,1,'SEMPERM')
EndIf
EndIf

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Verifica se o contrato pertence a um Edital e n � o permite deletar a
planilha. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
CN9->(dbSetOrder(1))
If CN9->(dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)).And.!
Empty(CN9->CN9_CODED)
Aviso (STR0059,STR0071,{"OK"}) // O contrato foi gerado por um edital e
por isso n � o se pode excluir planilhas
lRet := .F.
EndIf

EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o contrato pertence a um Edital e n � o permite incluir a planilha.
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet
If(nOpc == 3 .AND. nModulo != 28 .AND. nModulo != 69) //retirado pois essa
valida � � o ja � feita ao selecionar o numero do contrato dentro da rotina de
inclus � o da planilha
CN9->(dbSetOrder(1))
If CN9->(dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)).And.!
Empty(CN9->CN9_CODED)
lRet := .F.
lPer := .T.
Aviso (STR0059,STR0070,{"OK"}) // O contrato foi gerado por um
edital e por isso n � o se pode incluir planilhas
EndIf
EndIf
EndIf

If lRet
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Exclui campos da Enchoice de acordo com �
// � o tipo do contrato quando disponivel �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If aRotina[nOpc,4] != 3 .Or. lContrEd
If cEspCtr == "1"
aCpoN :=
{"CNA_FILIAL","CNA_ESPEL","CNA_DTMXMD","CNA_CLIENT","CNA_LOJACL","CNA_VLCOMS"}
Else
aCpoN :=
{"CNA_FILIAL","CNA_FORNEC","CNA_LJFORN","CNA_ESPEL","CNA_DTMXMD"}
EndIf
Else
If cContra != Nil .and. cEspCtr == "2"
aCpoN :=
{"CNA_FILIAL","CNA_ESPEL","CNA_DTMXMD","CNA_CRONOG","CNA_VLCOMS","CNA_CRONCT","CNA_
FORNEC","CNA_LJFORN"}
Else
aCpoN :=
{"CNA_FILIAL","CNA_ESPEL","CNA_DTMXMD","CNA_CRONOG","CNA_VLCOMS","CNA_CRONCT"}
EndIf
EndIf

dbSelectArea("SX3")
MsSeek("CNA")
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Seleciona os campos do cabecalho das planilhas �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
While !Eof() .And. SX3->X3_ARQUIVO == "CNA"

If X3Uso(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL .And.


aScan(aCpoN,{|x| x==AllTrim(SX3->X3_CAMPO)}) == 0
Aadd(aCpoEnch, SX3->X3_CAMPO )
EndIF

dbSkip()
EndDo

RegToMemory("CNA",(nOpc == 3))
If lContrEd
nPlan := aScan(aPlani,{|x| x[CNA->(FieldPos("CNA_NUMERO"))] == cPlani})
If nPlan > 0
For na:=1 to len(aCpoEnch)
nPos := CNA->(FieldPos(aCpoEnch[na]))
If nPos > 0
M->&(aCpoEnch[na]) := aPlani[nPlan,nPos]
EndIf
Next
EndIf
EndIf
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Devolve o tamanho da tela atualmente no micro do usuario. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Private aSizeAut := MsAdvSize()

Aadd(aObjects, { 100, 70, .T., .T. } )


Aadd(aObjects, { 100, 100, .T., .T. } )

aInfo := { aSizeAut[1], aSizeAut[2], aSizeAut[3], aSizeAut[4], 3, 3 }


aPosObj := MsObjSize(aInfo, aObjects)

aNoFields := CN200AFld(nOpc,lReadq,lReali,lContrEd,cEspCtr)

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica campos editaveis �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("SX3")
dbSetOrder(1)
MsSeek("CNB")
While !EOF() .And. (SX3->X3_ARQUIVO == "CNB")
If X3Uso(X3_USADO) .And. cNivel >= SX3->X3_NIVEL .And. Ascan(aNoFields,
{|x| x == alltrim(SX3->X3_CAMPO)}) == 0
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Impede alteracao dos campos no array aNAlter �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If Empty(CN9->CN9_CODED) .Or. nModulo == 69
If SX3->X3_VISUAL == "A" .And. aScan(aNAlter,AllTrim(SX3-
>X3_CAMPO)) == 0
aAdd(aAlter,SX3->X3_CAMPO)
EndIf
Else
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Se a planilha pertence a um edital, permite alterar
apenas o campo ref. a TES �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If SX3->X3_VISUAL == "A" .And. aScan(aAlterEdt,AllTrim(SX3-
>X3_CAMPO)) > 0
aAdd(aAlter,SX3->X3_CAMPO)
EndIf
EndIf
EndIf
dbSelectArea("SX3")
dbSkip()
EndDo

If nOpc != 3

If !lContrEd
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta query para preenchimento da fillgetdados �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNB")
dbSetOrder(1)
cFilCod := xFilial("CNB")
aStruCNB := CNB->(dbStruct())

If Empty(Ascan(aStruCNB,{|x| x[2]=="M"}))
cQuery := "SELECT CNB.* "
cQuery += " FROM "+RetSQLName("CNB")+" CNB"
cQuery += " WHERE CNB.CNB_FILIAL = '"+xFilial("CNB")+"'"
cQuery += " AND CNB.CNB_CONTRA = '"+M->CNA_CONTRA+"'"
cQuery += " AND CNB.CNB_REVISA = '"+M->CNA_REVISA+"'"
cQuery += " AND CNB.CNB_NUMERO = '"+M->CNA_NUMERO+"'"
cQuery += " AND CNB.D_E_L_E_T_ = ' '"
EndIf

cSeek := cFilCod+M->CNA_CONTRA+M->CNA_REVISA+M->CNA_NUMERO
cWhile := "CNB_FILIAL+CNB_CONTRA+CNB_REVISA+CNB_NUMERO"

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Executa fillgetdados para edicao �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
FillGetDados(nOpc,"CNB",1,cSeek,{||
&cWhile },bCondicao,aNoFields,,,cQuery,,,aHeaderPla,aColsPla,,,,)
Else
If nPlan > 0
aColsPla := aPlIt[nPlan]
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Executa fillgetdados para edicao atraves do contrato �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

FillGetDados(nOpc,"CNB",1,,,,aNoFields,,,,,.T.,If(len(aHeaderPla)==0,aHeaderPla,NIL
),aColsPla,)
EndIf
EndIf
Else
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa fillgetdados para inclusao �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

FillGetDados(nOpc,"CNB",1,,,,aNoFields,,,,,.T.,If(len(aHeaderPla)==0,aHeaderPla,NIL
),aColsPla,)
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Preenche primeito item da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aColsPla[1][aScan(aHeaderPla,{|x| Trim(x[2])=="CNB_ITEM"})] :=
StrZero(1,Len(CNB->CNB_ITEM))
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Se for contrato de vendas, atualiza na planilha o cliente inserido
no contrato �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lContrEd .Or. FunName()=="CNTA100"
//-- Adiciona planilha
If aPlani # NIL
aAdd(aPlani,Array(CNA->(FCount()) + 1))
aTail(aTail(aPlani)) := {}
nPlan := Len(aPlani)
EndIf

If (M->CN9_CLIENT <> Nil .Or. !Empty(M->CN9_CLIENT))


M->CNA_CLIENT := M->CN9_CLIENT
M->CNA_LOJACL := M->CN9_LOJACL
EndIf
EndIf
EndIf
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ponto de Entrada para manipulacao do aHeaderPla e do aColsPla �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If l200PLN
aRetPE := ExecBlock("CTA200PLN",.F.,.F.,
{nOpc,aClone(aHeaderPla),aClone(aColsPla)})
If Valtype(aRetPE) == "A"
If ValType(aRetPE[1]) == "A"
aHeaderPla := aRetPE[1]
Endif
If ValType(aRetPE[2]) == "A"
aColsPla := aRetPE[2]
Endif
Endif
Endif
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Ponto de Entrada para tratamento do campo centro de custo na solicitacao
compras. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If l200SCC
aFields := ExecBlock ("CTA200SCC",.F.,.F.)
Endif
If !lC200Auto
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Adiciona botoes para importacao de SC se o tipo do contrato for
compras �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If (nOpc == 3 .Or. nOpc == 4)
aadd(aButtons,{"SOLICITA",{||
if(CN200CabOk(aCpoEnch,@oDlg),Iif(cEspctr=="1",CN200SC(oGetDados,aPlIt),),) },OemTo
Ansi(STR0008),OemToAnsi(STR0010)}) //"Solicitacoes"
aadd(aButtons,{"pedido" ,{||
if(CN200CabOk(aCpoEnch,@oDlg),Iif(cEspctr=="1",CN200SCIt(oGetDados,aPlIt),),) },Oem
ToAnsi(STR0009),OemToAnsi(STR0011)})//"Solicitacoes por item"
aadd(aButtons,{"SOLICITA",{||
if(CN200CabOk(aCpoEnch,@oDlg),Iif(cEspctr=="1",CN200PC(oGetDados),),) },
OemToAnsi(STR0051), OemToAnsi(STR0052)})//"Pedido de Compras"

SetKey( VK_F4, { || Iif(cEspctr=="1",CN200SC(oGetDados,aPlIt),) }


)
SetKey( VK_F5, { || Iif(cEspctr=="1",CN200SCIt(oGetDados,aPlIt),)
} )
SetKey( VK_F6, { || Iif(cEspctr=="1",CN200PC(oGetDados),) } )
EndIf

If AliasInDic("CNZ")
Aadd(aButtons, {'S4WB013N',{|| oGetDados:oBrowse:lDisablePaint :=
.T. , GCTRateio(oGetDados,aRatPlan,nOpc,{M->CNA_CONTRA,M->CNA_REVISA,M-
>CNA_NUMERO},@aRatAux), oGetDados:oBrowse:lDisablePaint :=
.F. },STR0055,STR0056})//"Rateio por Item do pedido"##"Rateio "
Endif
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Adiciona bot � o para localiza � � o f � sica (Gestao de Servicos) �

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If SuperGetMv("MV_CNINTFS",.F.,.F.) .And. If(!Empty(cEspCtr),cEspCtr ==
'2',.T.) .And. FindFunction("AT110Man")
If aPlani # NIL
aAdd(aButtons,{"DESTINOS",{||
If(CN200CabOk(aCpoEnch,@oDlg),CN200Loca(M->CNA_CONTRA,M->CNA_REVISA,M-
>CNA_NUMERO,oGetDados,@aTail(aPlani[nPlan]),aPlani,nOpc==2),NIL)},STR0057,STR0058})
//"Localiza � � o F � sica"#"L.Fisica"
Else
aAdd(aButtons,{"DESTINOS",{||
If(CN200CabOk(aCpoEnch,@oDlg),CN200Loca(M->CNA_CONTRA,M->CNA_REVISA,M-
>CNA_NUMERO,oGetDados,@aLocais,,nOpc==2),NIL)},STR0057,STR0058})//"Localiza � � o
F � sica"#"L.Fisica"
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Botao para exportar dados para EXCEL �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If FindFunction("RemoteType") .And. RemoteType() == 1
aAdd(aButtons , {PmsBExcel()[1],{||
DlgToExcel({ {"ENCHOICE",STR0036,aGets,aTela},
{"GETDADOS",OemToAnsi(STR0037),aHeaderPla,aColsPla}})},PmsBExcel()[2],PmsBExcel()
[3]})
EndIf

If aRotina[ nOpc, 4 ] == 2

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Botao do Tracker �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aAdd(aButtons, { "bmpord1", { || CN200Track( aColsPla, aHeaderPla
) }, STR0038, STR0039 } ) // "System Tracker", "Tracker"

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Botao do banco de conhecimento �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aAdd(aButtons, { "clips", { || CN200Conhec() }, STR0041,
STR0042 } ) // "Banco de conhecimento", "Conhecim."

EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Avalia botoes do usuario �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock( "CN200BUT" )
If ValType( aUsButtons := ExecBlock( "CN200BUT", .F., .F., {nOpc}
) ) == "A"
If Len(aUsButtons)>=1 .And. ValType(aUsButtons[1]) == "A"
AEval( aUsButtons[1], { |x| AAdd( aButtons, x ) } )
EndIf
If Len(aUsButtons)>=2 .And. ValType(aUsButtons[2]) == "A"
for nx := 1 to len(aUsButtons[2])
aUsButtons[2][nx][2] := &(aUsButtons[2][nx][2])
aadd(aButtons,{aUsButtons[2][nx]
[1],aUsButtons[2][nx][2],aUsButtons[2][nx][3],aUsButtons[2][nx][4] } )
next
EndIf
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos usados no cadastro atraves da rotina de �
// � contratos �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If cContra != Nil
M->CNA_CONTRA := cContra
EndIf
If cPlani != Nil
M->CNA_NUMERO := cPlani
EndIf
If !Empty(dInicio) .And. Empty(M->CNA_DTINI)
M->CNA_DTINI := dInicio
EndIf
If !Empty(dTermino) .And. Empty(M->CNA_DTFIM)
M->CNA_DTFIM := dTermino
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Inicializa lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !lContrEd
PcoIniLan("000354")
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Dialog.

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
DEFINE MSDIALOG oDlg TITLE cCadastro From aSize[7],0 to
aSize[6],aSize[5] of oMainWnd PIXEL

EnChoice( cAlias, nReg, nOpc,,,,aCpoEnch, aPosObj[1], , , , , , , ,


.T.)

oGetDados:=MsNewGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],
IIF(nOpc!=3 .And. nOpc!
=4,0,GD_UPDATE+GD_INSERT+GD_DELETE),'CN200LinOk','CN200TudOk','+CNB_ITEM',aAlter,,9
999,'CN200FldOk',,'CN200DelOk',oDlg,aHeaderPla,aColsPla)

If AliasInDic("CNZ") .And. Len(aRateio)> 0 .And.


FindFunction("GetRatInBase")
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se a chamada ao programa de manutencao de planilhas
e feita pela manutencao �
// � de contratos. Se sim, verifica se nao ha rateio a ser
editado. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If IsInCallStack("CN100MANUT")
If !(Valtype(aRateio[1]) == "C" .and. aRateio[1] ==
"VAZIO")
aRatPlan := aClone(aRateio)
Endif
Else
aRatPlan := GetRatInBase(oGetDados,"CNA")
Endif
Endif

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �Ŀ
// � Valida o cabecalho antes do preenchimento dos itens

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oGetDados:oBrowse:bGotFocus := {||CN200CabOk(aCpoEnch,@oDlg) }

ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{||


If(CN200CabOk(aCpoEnch,@oDlg) .And. oGetDados:TudoOk() .And. (If(l200VLPLA,
(If(ValType(lRetVlPla:=ExecBlock("CN200VLPLA",.F.,.F.,
{oGetDados,aPlani,aPlIt,nOpc,lContrEd}))=="L",lRetVlPla,.T.)),.T.)),
{nOpca:=1,oDlg:End()},nOpca:=0)},{||(nOpca:=2,oDlg:End())},,aButtons)
Else
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Executa rotina automatica para os itens �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If len(aAutoItens) > 0
// Atualiza o aHeader e o aCols conforme aAutoItens
For na:=1 to len(aCpoEnch)
nPos := aScan(aAutoCab,{|x| Trim(x[1])==Trim(aCpoEnch[na])})

If nPos > 0
M->&(aCpoEnch[na]) := aAutoCab[nPos,2]
EndIf
Next

If MsGetDAuto(aAutoItens,,{||
CN200TudOk()},aAutoCab,aRotina[nOpc][4])
nOpca := 1
Else
nOpca := 0
EndIf
Else
nOpca := 1
EndIf
EndIf

If nOpcA == 2 .And. aPlani # NIL .And. Len(aPlani) > 0


If !lContrEd
aPlani:= {}
Else
For nX := 1 to Len(aPlani)
If !(aPlani[nX][1] # NIL )
aDel(aPlani,nX)
aSize(aPlani,len(aPlani)-1)
EndIf
Next nX
EndIf
EndIf
SetKey(VK_F4,Nil)
SetKey(VK_F5,Nil)
SetKey(VK_F6,Nil)

If (nOpca == 1 .And. nOpc != 2)


// Verifica se ha rateio e adicao de novos itens para atualizar a CNZ
If AliasInDic("CNZ") .And. Alltrim(FunName()) $ "CNTA100" // Acionar
somente quando a planilha � gravada na rotina do contrato
aAreaCNZ := CNZ->(GetArea())
dbSelectArea("CNZ")
CNZ->(dbSetOrder(1))
If CNZ->(DbSeek(xFilial("CNZ")+M->CN9_NUMERO+M->CN9_REVISA)) .Or.
Len(aRatPlan) > 0
GCTRateio(oGetDados,aRatPlan,nOpc,{M->CNA_CONTRA,M-
>CNA_REVISA,M->CNA_NUMERO},,.T.)
Endif
RestArea(aAreaCNZ)
Endif
If !lC200Auto
If !lContrEd
Begin Transaction
CN200Grv(nOpc,oGetDados,,,,aRatPlan,aLocais)
End Transaction
Else
CN200AGrv(nOpc,aPlani,aPlIt,oGetDados)
EndIf
Else
Begin Transaction
CN200Grv(nOpc,oGetDados,lC200Auto,aHeader,aCols,aRatPlan)
End Transaction
EndIf

If nOpc == 4 .And. !Empty(CNA->CNA_CRONOG)


dbSelectArea("CNF")
dbSetOrder(2)
cFilCod := xFilial("CNF")
If dbSeek(cFilCod+CNA->CNA_CONTRA+CNA->CNA_REVISA+CNA-
>CNA_CRONOG)
nTotCronog := 0
//Soma total do cronograma
While CNF->CNF_FILIAL == cFilCod .And. CNF->CNF_NUMERO ==
CNA->CNA_CRONOG
nTotCronog += CNF->CNF_VLPREV
dbSkip()
EndDo
If nTotCronog != CNA->CNA_VLTOT
If MsgYesNo(STR0035)//"O cronograma deve ser
atualizado de acordo com a planilha. Selecione 'Sim' para regerar as parcelas e
'Nao' para alter � - las manualmente"
CN110Manut("CNF",RecNo(),4,,CNA-
>CNA_CONTRA,CNA->CNA_REVISA,.T.,.T.)
Else
CN110Manut("CNF",RecNo(),4,,CNA-
>CNA_CONTRA,CNA->CNA_REVISA,.T.,.F.)
EndIf
EndIf
EndIf
EndIf

If nOpc == 4 .And. !Empty(CNA->CNA_CRONCT)


dbSelectArea("CNW")
dbSetOrder(1)
cFilCod := xFilial("CNW")
If dbSeek(cFilCod+CNA->CNA_CONTRA+CNA->CNA_REVISA+CNA-
>CNA_CRONCT)
nTotCronog := 0
//Soma total do cronograma
While CNW->CNW_FILIAL == cFilCod .And. CNW->CNW_NUMERO ==
CNA->CNA_CRONCT
nTotCronog += CNW->CNW_VLPREV
dbSkip()
EndDo
If nTotCronog != CNA->CNA_VLTOT
If MsgYesNo(STR0047)//"O cronograma cont � bil deve
ser atualizado de acordo com a planilha. Selecione 'Sim' para regerar as parcelas e
'N � o' para alter � - las manualmente."
CN270Manut("CNV",RecNo(),4,,CNA-
>CNA_CONTRA,CNA->CNA_REVISA,.T.,.T.)
Else
CN270Manut("CNV",RecNo(),4,,CNA-
>CNA_CONTRA,CNA->CNA_REVISA,.T.,.F.)
EndIf
EndIf
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Confere se a chamada ao programa de manutencao de planilhas nao e
feita pelo programa de manutencao �
// � de contratos. Caso seja, atualiza o array aRateio com o rateio
definido na planilha. Pois, quando �
// � o programa de planilhas e chamado pela rotina de contratos, o
cadastro da planilha so e feito �
// � ao atualizar a tela de formulario do contrato.

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If IsInCallStack("CN100MANUT")
For nX := 1 to len(aRatPlan)
nPos := aSCan(aRateio,{|x| alltrim(x[1]) + alltrim(x[2]) +
alltrim(x[3]) + alltrim(x[4]) == Alltrim(aRatPlan[nX,1]) + Alltrim(aRatPlan[nX,2])
+ Alltrim(aRatPlan[nX,3]) + Alltrim(aRatPlan[nX,4])})
If nPos > 0
aRateio[nPos] := aClone(aRatPlan[nX])
Else
aAdd(aRateio,aClone(aRatPlan[nX]))
Endif
Next nX
Endif
EndIf

If !lC200Auto
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Finaliza lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !lContrEd
PcoFinLan("000354")
PcoFreeBlq("000354",,,,,(nOpc == 4 .And. nOpca!=1))
EndIf
EndIf
EndIF
RestArea(aArea)

If cPlani != Nil
If !lPer
cPlani := M->CNA_NUMERO
EndIf
EndIf

Return (nOpca == 1)

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200SC � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Exibe Solicitacoes de compra em aberto ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200SC(oExp01) ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � oExp01 - GetDados ���
��� � aExp02 - Array com os itens das planilhas ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200SC(oGetDados,aPlIt)

Local l200SCC := ExistBlock("CTA200SCC")


Local lSolic := IF(SuperGetMv("MV_RESTCOM")=="S",.T.,.F.)
Local lInverte := .F.

Local oDlg
Local oMark

Local aFields := {}
Local aArea := GetArea()
Local aGrupo := UsrGrComp(RetCodUsr())
Local aAreaSX3 := SX3->(GetArea())
Local aAreaSC1 := SC1->(GetArea())
Local aCpos := {}
Local aMarca := {}
Local aCampos :=
{"C1_OK","C1_NUM","C1_ITEM","C1_PRODUTO","C1_QUANT","C1_QUJE","C1_DESCRI","C1_GRUPC
OM"}
Local aButEnc := {}
Local aHeader := oGetDados:aHeader
Local aCols := oGetDados:aCols
Local aMark := {}
Local aFiltro := {}
Local aCTBEnt := If(FindFunction("CTBEntArr"),CTBEntArr(),{})
Local cMarca := GetMark()
Local cAlias := "SC1"
Local cCampoOk := "C1_OK"
Local cCadastro := OemToAnsi(STR0012)
Local cCpoPre := If(GetMV("MV_CNPRECO"),"B1_UPRC","B1_CUSTD")
Local cFilSC1 := 'C1_FILIAL == "'+xFilial('SC1')+'".And. C1_QUJE < C1_QUANT
.And. C1_TPOP<>"P" .And. C1_TPSC<>"2" .And. C1_APROV$" ,L" .And.( C1_COTACAO ==
"'+Space(Len(SC1->C1_COTACAO))+'" .Or. C1_COTACAO == "'+Replicate("X",Len(SC1-
>C1_COTACAO))+'")'+' .And. SC1->C1_FLAGGCT <> "1"'
Local cCn200Sc1 := ""
Local cCn200SCF := ""

Local nOpcA := 0
Local nPosCod := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_PRODUT"})
Local nPosPrc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})
Local nPosQuant := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QUANT"})
Local nPosTotal := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLTOT"})
Local nPosNmSc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_NUMSC"})
Local nPosItSc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEMSC"})
Local nPosQtSol := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QTDSOL"})
Local nPosItem := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEM"})
Local nExistIt := 0
Local nDeleta := 0
Local nx := 0
Local ny := 0
Local nSaldo := 0

Private aGrupoSC := UsrGrComp(RetCodUsr())

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ponto de Entrada para adicionar o filtro customizado ao filtro da tabela SC1

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200SC1")
cCn200Sc1 := ExecBlock("CN200SC1",.F.,.F.)
If ( ValType(cCn200Sc1) == "C" ) .And. !Empty(cCn200Sc1)
cFilSC1 += IIf(Empty(cFilSC1),"",".AND.")+cCn200Sc1
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ponto de Entrada para customizar o filtro da tabela SC1 �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200FSC")
cCn200SCF := ExecBlock("CN200FSC",.F.,.F.)
If ( ValType(cCn200SCF) == "C" ) .And. !Empty(cCn200SCF)
cFilSC1 := cCn200SCF
EndIf
EndIf

dbSelectArea("SC1")
dbSetOrder(1)
Set Filter To &(cFilSC1)
cFilter := cFilSC1

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Monta os botoes da enchoice passando o filtro para ser restaurado na saida da
visualizacao �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aButEnc := { {"PESQUISA",{|| axPesqui() },OemToAnsi(STR0013)} ,;
//"Pesquisar"
{"RELATORIO",{||
A110Visual("SC1",RecNo(),2)},OemToAnsi(STR0014)} } //"Visualizar" -- Usa funcao
de visualizacao do pedido de compra

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta o Header com os titulos do MsSelect �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("SX3")
dbSetOrder(2)
For nx := 1 to Len(aCampos)
If MsSeek(aCampos[nx])
If AllTrim(aCampos[nx])=="C1_OK"
AADD(aCpos,{aCampos[nx],""," ",X3_PICTURE})
Else
AADD(aCpos,{aCampos[nx],"",AllTrim(X3Titulo()),X3_PICTURE})
EndIf
EndIf
Next

dbSelectArea("SX3")
dbSetOrder(1)
MsSeek(cAlias)
While !Eof() .And. SX3->X3_ARQUIVO == cAlias
IF ( SX3->X3_BROWSE=="S".And.SX3->X3_CONTEXT <> "V" .And. X3Uso(SX3-
>X3_USADO).And. Ascan(aCpos,{|x| Alltrim(x[1]) == Alltrim(SX3->X3_CAMPO)})==0 )
Aadd(aCpos,{SX3->X3_CAMPO,"",AllTrim(X3Titulo()),X3_PICTURE})
EndIf
dbSkip()
Enddo

DEFINE MSDIALOG oDlg TITLE cCadastro From 30,30 To 285,600 OF oMainWnd PIXEL

oMark := MsSelect():New(cAlias,cCampoOk,"CN200FLAG()",aCpos,@lInverte,@cMarca,
{ 17,2,113,285})
oMark:bMark := {||
CN200AddMark(cMarca,@aMarca,cCampoOk,cAlias),oMark:OBROWSE:Refresh()}

ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{||(nOpcA:=1),(oDlg:End())},{||


oDlg:End()},,aButEnc)

dbSelectArea("SC1")
dbSetOrder(1)
dbClearFilter()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta o aCols com as SCs selecionados �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If nOpcA== 1

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Ponto de Entrada para tratamento do campo centro de custo na solicitacao
compras. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If l200SCC
aFields := ExecBlock ("CTA200SCC",.F.,.F.)
Endif

For nx := 1 to Len(aMarca)

dbSelectArea(cAlias)
MsGoto(aMarca[nx])

If !( lSolic .And. aScan(aGrupo,SC1->C1_GRUPCOM) <= 0 ) .Or. Empty(SC1-


>C1_GRUPCOM)
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Calcula saldo do item �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
nSaldo :=
CN200SaldoSC(nPosCod,nPosNmSc,nPosItSC,nPosItem,nPosQuant,nPosQtSol,M-
>CNA_CONTRA,M->CNA_NUMERO,M->CNA_REVISA,aCols,aPlIt)

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Varre o aCols e compara se ja existe o item da solicitacao

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
nExistIT := Ascan(aCols,{|x| x[nPosNmSc] ==
FieldGet(FieldPos(aCampos[2])) .And. x[nPosItSc] ==
FieldGet(FieldPos(aCampos[3]))})

If nExistIT = 0
If aMarca[nx] > 0

nDeleta := Ascan(aCols,{|x| x[nPosCod] = " "})


If nDeleta >0
Adel(aCols,nDeleta)//Exclui linha em branco
Asize(aCols,Len(aCols)-1)
Endif

cItem := IIf(Empty(aCols),StrZero(1,Len(CNB-
>CNB_ITEM)),Soma1(aCols[Len(aCols)][1]))
AADD(aCols,Array(Len(aHeader)+1))//inclui novo item

For nY := 1 To Len(aHeader)//Preenche os campos


Do Case
Case Trim(aHeader[nY][2]) == "CNB_ITEM"
aCols[Len(aCols)][nY] := cItem
Case Trim(aHeader[nY][2]) == "CNB_NUMERO"
aCols[Len(aCols)][nY] := M-
>CNA_NUMERO
Case Trim(aHeader[nY][2]) ==
"CNB_REVISAO"
aCols[Len(aCols)][nY] := M-
>CNA_REVISAO
Case Trim(aHeader[nY][2]) == "CNB_CONTRA"
aCols[Len(aCols)][nY] := M-
>CNA_CONTRA
Case Trim(aHeader[nY][2]) == "CNB_QUANT"
aCols[Len(aCols)][nY] := nSaldo
Case Trim(aHeader[nY][2]) == "CNB_PRODUT"
aCols[Len(aCols)][nY] := SC1-
>C1_PRODUTO
Case Trim(aHeader[nY][2]) == "CNB_NUMSC"
aCols[Len(aCols)][nY] := SC1-
>C1_NUM
Case Trim(aHeader[nY][2]) == "CNB_ITEMSC"
aCols[Len(aCols)][nY] := SC1-
>C1_ITEM
Case Trim(aHeader[nY][2]) == "CNB_QTDSOL"
aCols[Len(aCols)][nY] := nSaldo
Case Trim(aHeader[nY][2]) == "CNB_DESCRI"
aCols[Len(aCols)][nY] := SC1-
>C1_DESCRI
Case Trim(aHeader[nY][2]) == "CNB_UM"
aCols[Len(aCols)][nY] := SC1->C1_UM

Case Trim(aHeader[nY][2]) == "CNB_VLUNIT"


aCols[Len(aCols)][nY] :=
Posicione("SB1",1,xFilial("SB1")+SC1->C1_PRODUTO,cCpoPre)
Case Trim(aHeader[nY][2]) == "CNB_TE"
aCols[Len(aCols)][nY] :=
Posicione("SB1",1,xFilial("SB1")+SC1->C1_PRODUTO,"SB1->B1_TE")//Seleciona TES

Case IsHeadRec(Trim(aHeader[nY][2]))
== .T.
aCols[Len(aCols)][nY] := CNB-
>(Recno())
Case IsHeadAlias(Trim(aHeader[nY][2])) ==
.T.
aCols[Len(aCols)][nY] := "CNB"
Case Trim(aHeader[nY][2]) == "CNB_CONTA"
aCols[Len(aCols)][nY] := SC1-
>C1_CONTA
Case Trim(aHeader[nY][2]) == "CNB_ITEMCT"
aCols[Len(aCols)][nY] := SC1-
>C1_ITEMCTA
Case Trim(aHeader[nY][2]) == "CNB_CC"
aCols[Len(aCols)][nY] := SC1->C1_CC

OtherWise
aCols[Len(aCols)][nY] :=
CriaVar(aHeader[ny,2])
EndCase
Next nY

For nY := 1 To Len(aCTBEnt)
If GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"CR",aHeader) > 0 .And. SC1->(FieldPos("C1_EC"+aCTBEnt[nY]+"CR")) > 0
aTail(aCols)
[GDFieldPos("CNB_EC"+aCTBEnt[nY]+"CR",aHeader)] := SC1->&("C1_EC"+aCTBEnt[nY]+"CR")
EndIf
If GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"DB",aHeader) > 0 .And. SC1->(FieldPos("C1_EC"+aCTBEnt[nY]+"DB")) > 0
aTail(aCols)
[GDFieldPos("CNB_EC"+aCTBEnt[nY]+"DB",aHeader)] := SC1->&("C1_EC"+aCTBEnt[nY]+"DB")
EndIf
Next nY

aCols[Len(aCols)][nPosTotal] := aCols[Len(aCols)]
[nPosPrc]*aCols[Len(aCols)][nPosQuant]
aCols[Len(aCols)][Len(aHeader)+1] := .F.

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Impede que o item da planilha seja deletado pela
getdados �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oGetDados:lNewLine:=.F.

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Varre array para preenchimento.

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If len(aFields) > 0
For nY := 1 To Len(afields)
If (nposfield:= aScan(aHeader, {|x|
AllTrim(x[2])==afields[nY,1]})) > 0
aCols[len(aCols),nposfield]:=
&(afields[nY,2])
Endif
Next ny
EndIf
EndIf
EndIf
EndIf
Next
EndIf

oGetDados:Refresh()

RestArea(aAreaSC1)
RestArea(aAreaSX3)

RestArea(aArea)
Return(.T.)

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200Flag � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida o usuario atraves da solicitacao selecionada ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200Flag() ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200Flag()

//Local aGrupoSC := UsrGrComp(RetCodUsr())


Local lSolic := IF(SuperGetMv("MV_RESTCOM")=="S",.T.,.F.)
Local cFlag := IIf(C1_QUJE>=C1_QUANT,'X',' ')
+If(C1_TPOP=='P'.And.C1_APROV$"R,B",'X',' ');
+If(Empty(SC1->C1_GRUPCOM),' ',If(lSolic.And.aScan(aGrupoSC,SC1->C1_GRUPCOM) <=
0,'X',' '))
Return cFlag

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200AddMark � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Altera marcacao realizada pelo usuario
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200AddMark(cExp01,aExp02,cExp03,cExp04)
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � cExp01 - Marca
��� � aExp02 - Array com as marcacoes
��� � cExp03 - Campo de validacao
��� � cExp04 - Alias do arquivo
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200AddMark(cMarca,aMarca,cCampoOk,cAlias)
Local cFilCod := xFilial(cAlias)
Local cNum := IIF(cAlias== "SC1",SC1->C1_NUM,SC7->C7_NUM)
Local cItem := IIF(cAlias== "SC1",SC1->C1_ITEM,SC7->C7_ITEM)
Local cFilCodPos:= IIF(cAlias== "SC1","C1_FILIAL","C7_FILIAL")
Local cNumPos := IIF(cAlias== "SC1","C1_NUM","C7_NUM")

Local aCN200SPC := {}
Local lCN200SPC := .F.

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Ponto de entrada para customizar a marcacao da solicitacao de compra / Pedido
de Compras �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200SPC")
aCN200SPC := ExecBlock("CN200SPC",.F.,.F.,{cMarca,aMarca,cCampoOk,cAlias})
If Valtype(aCN200SPC) == "A"
aMarca := aClone(aCN200SPC)
lCN200SPC := .T.
Endif
EndIf

If !lCN200SPC

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Posiciona no inicio da solicitacao de compra / Pedido de Compras �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSeek(xFilial(cAlias)+cNum)

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Percorre os itens da mesma solicitacao/ Pedido de Compras �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
While (cAlias)->&cFilCodPos == cFilCod .And. (cAlias)->&cNumPos == cNum
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Verifica se a solicita � � o de compra / Pedido de Compras j � esta
marcada �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If aScan(aMarca,RecNo())> 0
aMarca[aScan(aMarca,RecNo())] := 0
//Altera campo de marcacao para todos os itens
If &(cCampoOk) == cMarca
RecLock(cAlias,.F.)
&(cCampoOk) := ""
MsUnlock()
EndIf
Else
AADD(aMarca,Recno())
//Altera campo de marcacao para todos os itens
If &(cCampoOk) != cMarca
RecLock(cAlias,.F.)
&(cCampoOk) := cMarca
MsUnlock()
EndIf
EndIf
dbSkip()
EndDo

//Retorna para o item selecionado


dbSeek(xFilial(cAlias)+cNum+cItem)
EndIf

Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200SCIT � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Exibe solicitacoes de compra para importacao por item ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200SCIT(oExp01) ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � oExp01 - GetDados ���
��� � aExp02 - Array com os itens das planilhas ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200SCIT(oGetDados,aPlIt)
Local l200SCC := ExistBlock("CTA200SCC")
Local lSolic := IF(SuperGetMv("MV_RESTCOM")=="S",.T.,.F.)

Local aArea := GetArea()


Local aAreaSC1 := SC1->(GetArea())
Local aAreaSB1 := SB1->(GetArea())
Local aGrupo := UsrGrComp(RetCodUsr())
Local aCampos := {"C1_NUM","C1_ITEM","C1_PRODUTO","C1_QUANT","C1_DESCRI"}
Local aHeadCpos := {" "}
Local aLineNew := {}
Local aNewF4 := {}
Local aLineF4 := {}
Local aArrayF4 := {}
Local aSavRec := {}
Local aFiltro := {}
Local aCTBEnt := If(FindFunction("CTBEntArr"),CTBEntArr(),{})

Local bWhile := { || .T. }


Local bIf := { || .T. }
Local bLine := ""

Local aHeader := oGetDados:aHeader


Local aCols := oGetDados:aCols
Local aFields := {}

Local nPosNumSc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_NUMSC"})


Local nPosItem := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEM"})
Local nPosItSc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEMSC"})
Local nPosCod := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_PRODUT"})
Local nPosPrc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})
Local nPosQuant := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QUANT"})
Local nPosTotal := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLTOT"})
Local nPosQtSol := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QTDSOL"})

Local nOpcA := 0
Local nSavQual := 0
Local nX := 0
Local nY := 0
Local nInclui := 0
Local n := oGetDados:nAt

Local cVar := aCols[n][nPosCod]


Local cCadastro := ""
Local cAliasQry := ""
Local cQuery := ""
Local cQuerySc1 := ""
Local cDescr := ""
Local cLine := ""
Local cItem := "01"
Local cCpoPre := If(GetMV("MV_CNPRECO"),"B1_UPRC","B1_CUSTD")

Local oOk := LoadBitMap(GetResources(), "LBOK")


Local oNo := LoadBitMap(GetResources(), "LBNO")
Local oDlg
Local oQual

If !Empty(cVar)
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta o Header com os titulos do MsSelect �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("SX3")
dbSetOrder(2)
For nx := 1 to Len(aCampos)
If MsSeek(aCampos[nx])
AADD(aHeadCpos,AllTrim(X3Titulo()) )
EndIf
Next

dbSelectArea("SC1")
dbSetOrder(2)
If MsSeek(xFilial()+cVar)

bFiltro := { || .T. }

cAliasQry := CriaTrab( , .F. )

cQuery := ""

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Filtra solicitacoes de compra �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
cQuery += "SELECT R_E_C_N_O_ SC1RECNO "
cQuery += " FROM "+RetSqlName("SC1")
cQuery += " WHERE C1_FILIAL = '"+xFilial("SC1")+"'"
cQuery += " AND C1_PRODUTO = '"+cVar+"'"
cQuery += " AND C1_QUJE < C1_QUANT "
cQuery += " AND C1_TPOP <>'P' "
If SC1->(FieldPos("C1_TPSC")) > 0
cQuery += " AND C1_TPSC <> '2' "
EndIf
cQuery += " AND C1_APROV IN(' ','L') "
cQuery += " AND (C1_COTACAO ='"+Space(Len(C1_COTACAO))+"' OR
C1_COTACAO = '"+Replicate("X",Len(C1_COTACAO))+"') "
cQuery += " AND C1_FLAGGCT <> '1' AND "

If ExistBlock("CN200IT")
cQuerySc1 := ExecBlock("CN200IT",.F.,.F.)
If ( ValType(cQuerySc1) == "C" )
cQuery += cQuerySc1 + " AND "
EndIf
EndIf

cQuery += " D_E_L_E_T_<>'*'"

cQuery := ChangeQuery( cQuery )


dbUseArea( .T., "TOPCONN", TcGenQry( ,,cQuery ), cAliasQry, .F., .T. )

bWhile := { || !( cAliasQry )->( Eof() ) }


bIf := { || .T. }

While Eval( bWhile )

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Posiciona o SC1 �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
SC1->( MsGoto( ( cAliasQry )->SC1RECNO ) )
dbSelectArea( "SC1" )
If Eval( bIf ) .And. Eval( bFiltro )

If !( lSolic .And. aScan(aGrupo,SC1->C1_GRUPCOM) <= 0 )


.Or. Empty(SC1->C1_GRUPCOM)
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Calcula saldo do item

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � �
nSaldo :=
CN200SaldoSC(nPosCod,nPosNumSC,nPosItSC,nPosItem,nPosQuant,nPosQtSol,M-
>CNA_CONTRA,M->CNA_NUMERO,M->CNA_REVISA,aCols,aPlIt)
If nSaldo > 0

AADD(aArrayF4,{SC1->C1_NUM,SC1->C1_ITEM,SC1-
>C1_PRODUTO,TransForm(nSaldo,PesqPictQt("C1_QUANT")),SC1->C1_DESCRI})
AADD(aSavRec,RecNo())

EndIf

EndIf

EndIf

dbSelectArea( cAliasQry )
dbSkip()
EndDo
Else
Help(" ",1,"A120F4")
EndIf

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Seleciona descricao do produto �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
cDescr := Substr(Posicione("SB1",1,xFilial("SB1")+cVar,"SB1->B1_DESC"),1,15)

cCadastro := OemToAnsi(STR0012) //"Solicita � � o de Compras"

aNewF4 := {}

For nX := 1 To Len( aArrayF4 )


aLineF4 := aArrayF4[ nX ]
aLineNew := { .F. }
AEval( aLineF4, { |x| AAdd( aLineNew, x ) } )
AAdd( aNewF4, aLineNew )
Next nX

aArrayF4 := AClone( aNewF4 )

If Len(aArrayF4) > 0
nOpcA := 0

cLine := "{If(aArrayF4[oQual:nAt,1],oOk,oNo)"

For nX := 2 To Len( aHeadCpos )


cLine += ",aArrayF4[oQual:nAT][" + AllTrim( Str( nX ) ) + "]"
Next nX
cLine += " } "

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta dinamicamente o bline do CodeBlock �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
bLine := &( "{ || " + cLine + " }" )

DEFINE MSDIALOG oDlg FROM 30,30 TO 285,600 TITLE cCadastro OF oMainWnd


PIXEL

@ 15,4 Say STR0015 PIXEL //"Produto"


@ 14,30 MSGET cDescr WHEN .F. PIXEL//Descricao do Produto
oQual:=
TWBrowse():New( 29,4,278,86,,aHeadCpos,,oDlg,,,,,,,,,,,,.F.,,.T.,,.F.,,,)
oQual:SetArray(aArrayF4)
oQual:bLDblClick := { || aArrayF4[oQual:nAt,1] := !
aArrayF4[oQual:nAt,1] }
oQual:bLine := bLine

ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{||(nOpcA :=


1,nSavQual:= oQual:nAT,oDlg:End())},{||(nOpcA := 0,nSavQual:=
oQual:nAt,oDlg:End())})

If nOpcA == 1
cFilCod := xFilial("SC1")

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Ponto de Entrada para tratamento do campo centro de custo na
solicitacao compras. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If l200SCC
aFields := ExecBlock ("CTA200SCC",.F.,.F.)
Endif

For nx := 1 to Len(aArrayF4)

If aArrayF4[nx][1]

dbSelectArea("SC1")

dbSetOrder(1)
MsSeek(xFilial("SC1")+aArrayF4[nx][2]+aArrayF4[nx]
[3])

nInclui := Ascan(aCols,{|x| x[nPosQuant] = 0 .And.


x[nPosTotal] = 0})

If nInclui == 0
cItem :=
IIf(Empty(aCols),"01",SomaIt(aCols[Len(aCols)][1]))
AADD(aCols,Array(Len(aHeader)+1))

For nY := 1 To Len(aHeader)//Preenche os campos


de inclusao
Do Case
Case Trim(aHeader[nY][2]) ==
"CNB_ITEM"
aCols[Len(aCols)][nY] :=
cItem
Case Trim(aHeader[nY][2]) ==
"CNB_NUMERO"
aCols[Len(aCols)][nY] := M-
>CNA_NUMERO
Case Trim(aHeader[nY][2]) ==
"CNB_REVISAO"
aCols[Len(aCols)][nY] := M-
>CNA_REVISAO
Case Trim(aHeader[nY][2]) ==
"CNB_CONTRA"
aCols[Len(aCols)][nY] := M-
>CNA_CONTRA
Case Trim(aHeader[nY][2]) ==
"CNB_PRODUT"
aCols[Len(aCols)][nY] := SC1-
>C1_PRODUTO
Case Trim(aHeader[nY][2]) ==
"CNB_DESCRI"
aCols[Len(aCols)][nY] := SC1-
>C1_DESCRI
Case Trim(aHeader[nY][2]) ==
"CNB_UM"
aCols[Len(aCols)][nY] := SC1-
>C1_UM
OtherWise
aCols[Len(aCols)][nY] :=
CriaVar(aHeader[ny,2])
EndCase
Next nY

aCols[Len(aCols)][Len(aHeader)+1] := .F.
n := Len(aCols)
EndIf

For nY := 1 To Len(aHeader)//Preenche os campos


Do Case
Case Trim(aHeader[nY][2]) == "CNB_UM"
aCols[Len(aCols)][nY] := SC1->C1_UM
Case Trim(aHeader[nY][2]) == "CNB_QTDSOL"
aCols[Len(aCols)][nY] :=
val(aArrayF4[nx][5])
Case Trim(aHeader[nY][2]) == "CNB_QUANT"
aCols[Len(aCols)][nY] :=
val(aArrayF4[nx][5])
Case Trim(aHeader[nY][2]) == "CNB_NUMSC"
aCols[Len(aCols)][nY] := SC1-
>C1_NUM
Case Trim(aHeader[nY][2]) == "CNB_ITEMSC"
aCols[Len(aCols)][nY] := SC1-
>C1_ITEM
Case Trim(aHeader[nY][2]) == "CNB_DESC"
aCols[Len(aCols)][nY] := 0.00
Case Trim(aHeader[nY][2]) == "CNB_QTDMED"
aCols[Len(aCols)][nY] := 0.00
Case Trim(aHeader[nY][2]) == "CNB_VLDESC"
aCols[Len(aCols)][nY] := 0.00
Case Trim(aHeader[nY][2]) == "CNB_SLDMED"
aCols[Len(aCols)][nY] := 0.00
Case Trim(aHeader[nY][2]) == "CNB_VLUNIT"
aCols[Len(aCols)][nY] :=
Posicione("SB1",1,xFilial("SB1")+SC1->C1_PRODUTO,cCpoPre)//Selecione preco de
acordo com parametro MV_CNPRECO
Case Trim(aHeader[nY][2]) == "CNB_TE"
aCols[Len(aCols)][nY] :=
Posicione("SB1",1,xFilial("SB1")+SC1->C1_PRODUTO,"SB1->B1_TE")//Seleciona TES
Case Trim(aHeader[nY][2]) == "CNB_SLDREC"
aCols[Len(aCols)][nY] := 0.00
Case IsHeadRec(Trim(aHeader[nY][2]))
== .T.
aCols[Len(aCols)][nY] := CNB-
>(Recno())
Case IsHeadAlias(Trim(aHeader[nY][2])) ==
.T.
aCols[Len(aCols)][nY] := "CNB"
EndCase

Next nY

For nY := 1 To Len(aCTBEnt)
If GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"CR",aHeader) > 0 .And. SC1->(FieldPos("C1_EC"+aCTBEnt[nY]+"CR")) > 0
aTail(aCols)
[GDFieldPos("CNB_EC"+aCTBEnt[nY]+"CR",aHeader)] := SC1->&("C1_EC"+aCTBEnt[nY]+"CR")
EndIf
If GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"DB",aHeader) > 0 .And. SC1->(FieldPos("C1_EC"+aCTBEnt[nY]+"DB")) > 0
aTail(aCols)
[GDFieldPos("CNB_EC"+aCTBEnt[nY]+"DB",aHeader)] := SC1->&("C1_EC"+aCTBEnt[nY]+"DB")
EndIf
Next nY

//Calcula total do item

aCols[Len(aCols)][nPosTotal] := aCols[Len(aCols)]
[nPosPrc]*aCols[Len(aCols)][nPosQuant]
Endif

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �Ŀ
// � Varre array para preenchimento.

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If len(aFields) > 0
For nY := 1 To Len(afields)
If (nposfield:= aScan(aHeader, {|x|
AllTrim(x[2])==afields[nY,1]})) > 0
aCols[len(aCols),nposfield]:=
&(afields[nY,2])
Endif
Next ny
EndIf
Next
EndIf
Else
Aviso(OemToAnsi(STR0018),OemToAnsi(STR0033),{"Ok"})//"Nao ha itens em
aberto para o produto selecionado"
EndIf
Else
Aviso(OemToAnsi(STR0018),OemToAnsi(STR0043),{"Ok"})//"Preencha o produto"
EndIf

oGetDados:Refresh()

RestArea(aAreaSC1)
RestArea(aAreaSB1)
RestArea(aArea)

Return .T.

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200SaldoSC � Autor � Marcelo Custodio � Data �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Calcula saldo do item
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � nExp01 - Posicao do codigo do produto na CNB (CNB_PRODUT)
��� � nExp02 - Posicao do numero da SC na CNB (CNB_NUMSC)
��� � nExp03 - Posicao do item da SC na CNB (CNB_ITEMSC)
��� � nExp04 - Posicao do item da CNB (CNB_ITEM)
��� � nExp05 - Posicao da quantidade da CNB (CNB_QUANT)
��� � nExp06 - Posicao da quantidade solicitada da CNB (CNB_QTDSOL)
��� � nExp07 - Numero do contrato
��� � cExp08 - Numero da planilha
��� � cExp09 - Numero da revisao do contrato
��� � aExp10 - Acols dos itens de planilha
���
��� � aExp11 - Array com os itens das planilhas
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function
CN200SaldoSC(nPosCod,nPosNumSC,nPosItSC,nPosItem,nPosQuant,nPosQtSol,cNumCont,cNumP
la,cNumRevisa,aCols,aPlIt)

Local aArea := GetArea()


Local nSaldo := 0
Local nx
Local nY

nSaldo := SC1->C1_QUANT - SC1->C1_QUJE//Verifica saldo da solicitacao


For nx := 1 to Len(aCols)
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o item ja foi adicionado a planilha �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !aCols[nx][Len(aCols[nx])].And.!ATail(aCols[nx]).And.;
(aCols[ nx, nPosCod ] == SC1->C1_PRODUTO).And. ;
(aCols[ nx, nPosNumSC] == SC1->C1_NUM).And. ;
(aCols[ nx, nPosItSC ] == SC1->C1_ITEM)
nSaldo -= aCols[nx,nPosQuant]//Retira quantidade ja atendida
dbSelectArea("CNB")
dbSetOrder(1)
EndIf
Next nX

If !Empty(aPlIt)
For nx := 1 to Len(aPlIt)
For ny := 1 to Len(aPlIt[nX]) //Proximo item
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o item ja foi adicionado a planilha �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !aPlIt[nx][ny][Len(aPlIt[nx][ny])].And.!ATail(aPlIt[nx]
[ny]).And.;
(aPlIt[ nx,ny, nPosCod ] == SC1->C1_PRODUTO).And. ;
(aPlIt[ nx,ny, nPosNumSC] == SC1->C1_NUM).And. ;
(aPlIt[ nx,ny, nPosItSC ] == SC1->C1_ITEM)
nSaldo -= aPlIt[nx,ny,nPosQuant]//Retira quantidade ja
atendida
dbSelectArea("CNB")
dbSetOrder(1)

EndIf
Next nY
Next nX
EndIf

nSaldo := If(nSaldo > 0, nSaldo , 0 )

RestArea(aArea)
Return(nSaldo)

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200CabOk � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida cabecalho
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200CabOk(aExp01,oExp02)
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � aExp01 - Array com os campos do cabecalho
��� � oExp02 - Dialog
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200CabOk(aCpoEnch,oDlg)
Local cCpo := ""
Local cMens := ""
local lOk := .T.
Local n
Local cProg := FunName()
Local cFlagRej := '1'

If (lOk := Obrigatorio(aGets,aTela))
If lContrEd
If cEspctr =="1" // Verifica se o contrato e Compra ou Venda
If Empty(M->CNA_FORNEC) .Or. aScan(aForn,{|x| x[1] == M-
>CNA_FORNEC .And. x[2] == M->CNA_LJFORN .And. x[len(aHeader1)+1] == .F.}) == 0
cCpo := "CNA_FORNEC"
cMens := OemToAnsi(STR0021)//"Fornecedor inv � lido para o
contrato selecionado"
lOk := .F.
EndIf
Endif
If M->CNA_FLREAJ=='1' .And. M->CN9_FLGREJ=='2'
cCpo := "CNA_FLREAJ"
cMens := OemToAnsi(STR0049)//"Esta planilha n � o poder � ser
Reajustada. O contrato desta planilha n � o possui Reajuste."
lOk := .F.
EndIf
Else
If cEspctr =="1" // Verifica se o contrato e Compra ou Venda
If cProg == "CNTA100" //Rotina de manutencao de contratos
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche acols com o array dos fornecedores �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If Type("aForn") != "A"
aForn := aEval(oGetDad1:aCols,{|x| {x[aScan(aHeader1,
{|x| AllTrim(x[2]) == "CNC_CODIGO"})],x[aScan(aHeader1,{|x| AllTrim(x[2]) ==
"CNC_LOJA"})]}})
EndIf

If Empty(M->CNA_FORNEC) .Or. aScan(aForn,{|x| x[1] == M-


>CNA_FORNEC .And. x[2] == M->CNA_LJFORN .And. x[len(aHeader1)+1] == .F.}) == 0
cCpo := "CNA_FORNEC"
cMens := OemToAnsi(STR0021)//"Fornecedor inv � lido
para o contrato selecionado"
lOk := .F.
EndIf
Else
dbselectarea("CNC")//Verifica se o fornecedor pertence ao
contrato
dbsetorder(1)
If !dbSeek(xFilial("CNC")+M-
>CNA_CONTRA+If(FieldPos("CNC_REVISA")>0,M->CNA_REVISA,"")+M->CNA_FORNEC+M-
>CNA_LJFORN)
cCpo := "CNA_FORNEC"
cMens := OemToAnsi(STR0021)//"Fornecedor inv � lido
para o contrato selecionado"
lOk := .F.
EndIf
EndIf
EndIf
cFlagRej := Iif(IsInCallStack("Cn100AltPla"),M->CN9_FLGREJ,CN9-
>CN9_FLGREJ)
If M->CNA_FLREAJ=='1' .And. cFlagRej=='2'
cCpo := "CNA_FLREAJ"
cMens := OemToAnsi(STR0049)//"Esta planilha n � o poder � ser
Reajustada. O contrato desta planilha n � o possui Reajuste."
lOk := .F.
EndIf
EndIF
If !lOk
//Encontra posicao do Get na Enchoice
n := ascan(odlg:acontrols,{|x| x:CREADVAR = "M->" + cCpo})
if(n > 0)
odlg:acontrols[n]:SetFocus()
EndIF
Aviso(OemToAnsi(STR0018),OemToAnsi(cMens),{"Ok"}) //Exibe Mensagem ###
":: Aten � � o ::"
EndIf
EndIf

Return lOk

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200LinOk � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida item da planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200LinOK(oExp01)
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � oExp01 - Estrutura da linha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200LinOk(o)
Local lRet := .T.
Local lRet1 := .T.
Local lCN200CVL := .T.
Local lCN200VTOT := .T.
Local lC200Auto :=((Type("lC200Auto") == "L") .And. lC200Auto)
Local lFilOri := CNB->(FieldPos("CNB_FILORI")) > 0

Local uRet := .T.

Local aHeader := If (lC200Auto,aHeader,o:oMother:aHeader)


Local aCols := If (lC200Auto,aCols ,o:oMother:aCols)

Local nPosSC1 := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_NUMSC"})


Local nPosItSC1 := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEMSC"})
Local nPosQuant := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QUANT"})
Local nPosVlUni := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})
Local nPosVlTot := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLTOT"})
Local nPosProd := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_PRODUT"})
Local nPosUM := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_UM"})
Local nPosTS := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_TS"})
Local nPosFilOr := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_FILORI"})
Local nTamTot := TamSX3("CNB_VLTOT")[2]
Local nA := 0

Local cFilSC1 := xFilial("SC1")

//Campos obrigatorios da linha


Local aPosCto := {}
//Verifica se permite incluir planilha para produto com contrato de parceria
Local lProdCtr := GetNewPar("MV_PRODCTR",.F.)

//Verifica se � Titulo ou Pedido no tipo de contrato selecionado


Local cCtrmed := ''

If CN1->(FieldPos("CN1_CTRMED")) > 0 .And. Type("M->CN9_TPCTO") <> "U" //quando


n � o vem da rotina de manuten � � o de contrato nao cria M->CN9
If CN1->(dbSeek(xFilial("CN1")+M->CN9_TPCTO))
cCtrmed := CN1->CN1_CTRMED
EndIf
EndIf

If (!Empty(CNB->(FieldPos("CNB_TS"))))
aPosCto:= iIf(cEspCtr == "1" .Or. cCtrmed == '2',
{nPosQuant,nPosVlUni,nPosProd,nPosUM},
{nPosQuant,nPosVlUni,nPosProd,nPosUM,nPosTS} )
Else
aPosCto:= iIf(cEspCtr == "1" ,{nPosQuant,nPosVlUni,nPosProd,nPosUM},
{nPosQuant,nPosVlUni,nPosProd,nPosUM} )
EndIf
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Chama ponto de entrada para validacoes especificas �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200CVL")
lCN200CVL := ExecBlock("CN200CVL",.F.,.F.,{aCols[n],aHeader})
lRet := If(Valtype(lCN200CVL)=="L",lCN200CVL,lRet)
Else
If !aCols[o:nAt,len(aHeader)+1]
For nA := 1 to len(aPosCto)
if Empty(aCols[o:nAt][aPosCto[nA]])
lRet := .F.
exit
EndIf
Next nA

If !lRet
If cEspCtr == "1"
Help(" ",1,"CNTA200TE2") //"Os campos Produto, Quantidade,
Valor Unit � rio ou Un. Medida est � o em Branco. "
Else
Help(" ",1,"CNTA200TS3") //"Os campos Produto, Quantidade,
Valor Unit � rio, Un. Medida ou TES est � o em Branco. "
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Ponto de entrada valida ou n � o o c � lculo do valor total do item
selecionado �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200VTOT")
lCN200VTOT := ExecBlock("CN200VTOT",.F.,.F.,{aCols[n],aHeader})
lRet1:= If(Valtype(lCN200VTOT)=="L",lCN200VTOT,.T.)
EndIf

If lRet1
If lRet .And. ( NoRound(aCols[o:nAt][nPosQuant]*aCols[o:nAt]
[nPosVlUni],nTamTot) != aCols[o:nAt][nPosVlTot] ) .And.;
( Round(aCols[o:nAt][nPosQuant]*aCols[o:nAt]
[nPosVlUni],nTamTot) != aCols[o:nAt][nPosVlTot] )
Aviso("CNTA200",STR0048,{"OK"})//"Valor total inv � lido!"
lRet := .F.
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Valida produto com Contrato de Parceria �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !lProdCtr
dbSelectArea("SB1")
dbSetOrder(1)
If dbSeek(xFilial("SB1")+aCols[o:nAt][nPosProd])
If SB1->B1_CONTRAT='S'
Help(" ",1,"CNTA200PRD")
lRet := .F.
EndIf
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Valida produto em relacao a solicitacao de compra �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !Empty(aCols[o:nAt][nPosSC1])
If lFilOri .And. !Empty(aCols[o:nAt][nPosFilOr])
cFilSC1 := xFilial("SC1",aCols[o:nAt][nPosFilOr])
EndIf

dbSelectArea("SC1")
dbSetOrder(1)
If dbSeek(cFilSC1+aCols[o:nAt][nPosSC1]+aCols[o:nAt][nPosItSC1])
If SC1->C1_PRODUTO != aCols[o:nAt][nPosProd]
Help(" ",1,"CNTA200INV") //"Produto invalido para o
item"
lRet := .F.
EndIf
EndIf
EndIf
EndIf

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Chama ponto de entrada para validacoes especificas �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200VLIN")
uRet := ExecBlock("CN200VLIN",.F.,.F.,{aCols[n],aHeader})
lRet := If(Valtype(uRet)=="L",uRet,lRet)
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Valida lancamento do SIGAPCO �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !lC200Auto
lRet:= PcoVldLan('000354','02','CNTA200',,, .T.)
EndIf

EndIf
Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200TudOk � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida itens da planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200TudOK()
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200TudOk(o)

Local lRet := .T.


Local lC200Auto := ((Type("lC200Auto") == "L") .And. lC200Auto)
Local lCN200CVT := .T.
Local lFilOri := CNB->(FieldPos("CNB_FILORI")) > 0

Local aHeader := IIf(lC200Auto,aHeader,o:oMother:aHeader)


Local aCols := IIf(lC200Auto,aCols ,o:oMother:aCols)

Local cFilSA5 := xFilial("SA5")


Local cFilSC1 := xFilial("SC1")
Local cFilSAD := xFilial("SAD")
Local cFilSB1 := xFilial("SB1")

Local nA := 0
Local nI := 0
Local nPosItem := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEM"})
Local nPosSC1 := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_NUMSC"})
Local nPosItSC1 := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEMSC"})
Local nPosQuant := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QUANT"})
Local nPosVlUni := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})
Local nPosProd := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_PRODUT"})
Local nPosUM := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_UM"})
Local nPosVlTot := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLTOT"})
Local nPosVlDec := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLDESC"})
Local nPosFilOr := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_FILORI"})

//Campos obrigatorios da linha


Local aPosCto := {nPosQuant,nPosVlUni,nPosProd,nPosUM}

//Verifica se valida amarracao produto X fornecedor


Local lVldPrd := ( GetNewPar("MV_CNVLAMR","N") == "S" )

//Verifica se permite incluir planilha para produto com contrato de parceria


Local lProdCtr := GetNewPar("MV_PRODCTR",.F.)

//Verifica se existem itens na planilha


If len(aCols) == 0
Help(" ",1,"CNTA200PLA") //"Insira um item na planilha"
lRet := .F.
Else
nI := 1
//Verifica itens deletados
While nI <= len(aCols) .And. aCols[nI][len(aHeader)+1]
nI++
EndDo

If nI > len(aCols)
Help(" ",1,"CNTA200PLA") //"Insira um item na planilha"
lRet := .F.
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Chama ponto de entrada para validacoes especificas �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200CVT")
If Empty(aRatAux) .And. !Empty(aRatPlan)
aRatAux := aClone(aRatPlan)
ElseIf Empty(aRatPlan)
aRatAux := GetRatInBase(oGetDados,"CNA")
EndIf
lCN200CVT := ExecBlock("CN200CVT",.F.,.F.,{aCols,aHeader,aRatAux})
lRet := If(Valtype(lCN200CVT)=="L",lCN200CVT,lRet)
Else
If lRet
M->CNA_VLTOT := 0

For nI := 1 to len(aCols)
//-- Nao validar linhas deletadas do aCols
If aCols[nI][Len(aCols[1])]
Loop
EndIf
For nA := 1 to len(aPosCto)
If Empty(aCols[nI][aPosCto[nA]])
lRet := .F.
Exit
EndIf
Next nA

If !lRet
Help(" ",1,"CNTA200COR") //"Preencha corretamente todos os
itens"
Exit
EndIf

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Valida produto em relacao a solicitacao de compra �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !Empty(aCols[nI][nPosSC1])
If lFilOri .And. !Empty(aCols[o:nAt][nPosFilOr])
cFilSC1 := xFilial("SC1",aCols[o:nAt][nPosFilOr])
EndIf

dbSelectArea("SC1")
dbSetOrder(1)
If dbSeek(cFilSC1+aCols[nI][nPosSC1]+aCols[nI][nPosItSC1])
If SC1->C1_PRODUTO != aCols[nI][nPosProd]
Help(" ",1,"CNTA200INV") //"Produto inv � lido
para o item"
lRet := .F.
Exit
EndIf
EndIf
EndIf

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Valida produto com Contrato de Parceria �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !lProdCtr
dbSelectArea("SB1")
dbSetOrder(1)
If dbSeek(cFilSB1+aCols[nI][nPosProd])
If SB1->B1_CONTRAT='S'
Help(" ",1,"CNTA200PRD")
lRet := .F.
Exit
EndIf
EndIf
EndIf

If lRet .And. lVldPrd .And. !Empty(M->CNA_FORNEC+M->CNA_LJFORN)


dbSelectArea("SA5")
dbSetOrder(1)
dbGoTop()

lProdFr := dbSeek(cFilSA5+M->CNA_FORNEC+M-
>CNA_LJFORN+aCols[nI][nPosProd])
If !lProdFr
dbSelectArea("SB1")
dbSetOrder(1)
If dbSeek(cFilSB1+aCols[nI][nPosProd])
dbSelectArea("SAD")
dbSetOrder(1)
lProdFr := dbSeek(cFilSAD+M->CNA_FORNEC+M-
>CNA_LJFORN+SB1->B1_GRUPO)
EndIf
EndIf

If !lProdFr
Aviso(STR0018,STR0044+AllTrim(aCols[nI][nPosItem])
+STR0045,{ "OK" },2)//"O produto informado no item "###" n � o est � amarrado ao
fornecedor informado. Verifique a amarra � � o produto X fornecedor."
lRet := .F.
Exit
EndIf
EndIf
M->CNA_VLTOT += (aCols[nI][nPosVlTot]-aCols[nI][nPosVlDec])
Next nI

If lRet .And. M->CNA_VLTOT<=0


Aviso(STR0018,OemtoAnsi(STR0050),{"Ok"}) //"O valor total da
planilha n � o pode ser zero ou negativa."
lRet := .F.
EndIf
//Valida numero da planilha
If lRet
lRet := CN200VldNum()
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Valida lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet
lRet:=
PcoVldLan('000354','01','CNTA200',/*lUsaLote*/,/*lDeleta*/,
.F./*lVldLinGrade*/)
EndIf
EndIf
EndIf

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200VldCon � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida contrato
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200VldCon()
Local aArea := GetArea()
Local lRet := .T.
Local cContrato := M->CNA_CONTRA
Local cRevisa := M->CNA_REVISA
Local cCtrFix := ""

If !Empty(cContrato)

If lContrEd
If cContrato <> M->CN9_NUMERO
lRet := .F.
Help(" ",1,"CNTA200COP")//"Numero do contrato cadastrado na
Planilha divergente ao Contrato.
EndIf
Else

lRet:= ExistCpo("CN9",cContrato+cRevisa)
EndIf

lRet := If(lContrEd,lRet,lRet.And.CN240VldUsr(cContrato,DEF_TRAINC,.T.))

If lRet
dbSelectArea("CN9")
dbSetOrder(1)

If Empty(cRevisa)
dbSeek(xFilial("CN9")+cContrato)
//Seleciona revisao mais recente se houver
If !Empty(CN9->CN9_REVATU)
M->CNA_REVISA := cRevisa := CN9->CN9_REVATU
EndIf
EndIF

//Verifica se o edital selecionado pertence a um edital


If !Empty(CN9->CN9_CODED)
lRet := .F.
Help(" ",1,"CNTA200EDT",,STR0070,4,1) //"Contrato foi gerado
por um edital e por isso nao se pode inserir planilha"
EndIf

If dbSeek(xFilial("CN9")+cContrato+cRevisa) .And. lRet

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o contrato aceita planilha �
// � Situacoes que aceitam a inclusao de planilha �
// � - 2 - Elaboracao �
// � - 3 - Emitido �
// � - 4 - Em Aprovacao �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If AllTrim(CN9->CN9_SITUAC) == DEF_SELAB .OR. AllTrim(CN9-
>CN9_SITUAC) == DEF_SEMIT .OR. AllTrim(CN9->CN9_SITUAC) == DEF_SAPRO
//Busca Tipo de Contrato
If (CN1->(FieldPos("CN1_CTRFIX")) > 0) .And. CN1-
>(dbSeek(xFilial("CN1")+CN9->CN9_TPCTO))
cCtrFix := CN1->CN1_CTRFIX
EndIf
//Para tipo de contrato fixo nao permite inclusao de
planilha
If cCtrFix != "2"
If Empty(CN9->CN9_CLIENT)
//Quando altera o numero do contrato limpa o
fornecedor
cEspctr:="1"

IF !Empty(CN9->CN9_REVATU)=.F.
If ALTERA .And. M->CNA_CONTRA != CNA-
>CNA_CONTRA
M->CNA_FORNEC :=
Space(TamSX3("CNA_FORNEC")[1])
M->CNA_LOJA :=
Space(TamSX3("CNA_LOJA")[1])
Endif

//Retorna numero na sequencia do contrato


para a planilha
M->CNA_NUMERO :=
CN200PlaNum(cContrato,cRevisa)
//Retorna data inicial do contrato, ou a
data atual
M->CNA_DTINI := If((CN9->CN9_DTINIC >
dDataBase),CN9->CN9_DTINIC,dDataBase)
//Retorna data final do contrato, ou a
data atual
M->CNA_DTFIM := If((CN9->CN9_DTFIM >
dDataBase),CN9->CN9_DTFIM,dDataBase)

dbSelectArea("CNC")
dbSetOrder(1)

//� � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Seleciona primeiro fornecedor
relacionado �
// � ao contrato

//� � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � �
If dbSeek(xFilial("CNC")+M-
>CNA_CONTRA+If(FieldPos("CNC_REVISA")>0,M->CNA_REVISA,""))
M->CNA_FORNEC := CNC->CNC_CODIGO
M->CNA_LJFORN := CNC->CNC_LOJA
Else
M->CNA_FORNEC :=
Space(TamSX3("CNA_FORNEC")[1])
M->CNA_LJFORN :=
Space(TamSX3("CNA_LJFORN")[1])
Endif
lRet := .T.
Else
lRet := .F.
Help(" ",1,"CNTA200CON") //"Contrato
revisado, selecione a vers � o mais recente."
EndIf
Else
//Quando altera o numero do contrato limpa o
Vendedor
cEspctr:="2"
IF !Empty(CN9->CN9_REVATU)=.F.
If ALTERA .And. M->CNA_CONTRA != CNA-
>CNA_CONTRA
M->CNA_CLIENT :=
Space(TamSX3("CNA_CLIENT")[1])
M->CNA_LOJACL :=
Space(TamSX3("CNA_LOJACL")[1])
Endif

//Retorna numero na sequencia do contrato


para a planilha
M->CNA_NUMERO :=
CN200PlaNum(cContrato,cRevisa)
//Retorna data inicial do contrato, ou a
data atual
M->CNA_DTINI := If((CN9->CN9_DTINIC >
dDataBase),CN9->CN9_DTINIC,dDataBase)
//Retorna data final do contrato, ou a
data atual
M->CNA_DTFIM := If((CN9->CN9_DTFIM >
dDataBase),CN9->CN9_DTFIM,dDataBase)

dbSelectArea("SA1")
dbSetOrder(1)
//� � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Seleciona primeiro cliente
relacionado ao contrato �
//� � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If dbSeek(xFilial("SA1")+CN9-
>CN9_CLIENT+CN9->CN9_LOJACL)
M->CNA_CLIENT := SA1->A1_COD
M->CNA_LOJACL := SA1->A1_LOJA
Else
M->CNA_CLIENT :=
Space(TamSX3("A1_COD")[1])
M->CNA_LOJACL :=
Space(TamSX3("A1_LOJA")[1])
Endif
lRet := .T.
Else
lRet := .F.
Help(" ",1,"CNTA200CON") //"Contrato
revisado, selecione a vers � o mais recente."
EndIf
Endif
Else
lRet := .F.
M->CNA_REVISA := Space(TamSX3("CNA_REVISA")[1])
Aviso(OemToAnsi(STR0018),OemToAnsi(STR0046),
{"Ok"}) //"O tipo do Contrato selecionado n � o permite a inclus � o de planilhas."
EndIf
Else
lRet := .F.
M->CNA_REVISA := Space(TamSX3("CNA_REVISA")[1])
Help(" ",1,"CNTA200ATU") //"A situa � � o atual do contrato
n � o permite a inclus � o de planilhas."
EndIf

ElseIf Empty(CN9->CN9_CODED)
//Limpa revisao quando o contrato nao for encontrado
M->CNA_REVISA := Space(TamSX3("CNA_REVISA")[1])
Endif
EndIf
Else
lRet := .F.
Endif

RestArea(aArea)
Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200PlaNum � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Retorna numero sequencial da planilha de acordo com o
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � cExp01 := CN200PlaNum(cExp02,cExp03)
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � cExp01 - Numero sequencial da planilha
��� � cExp02 - Numero do contrato
��� � cExp03 - Numero da revisao
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200PlaNum(cContra,cRevisa)
Local cNumPla := Strzero(0,TamSX3("CNA_NUMERO")[1])
Local cFilCod
Local aArea := GetArea()

dbSelectArea("CNA")
dbSetOrder(1)

cFilCod := xFilial("CNA")
dbSeek(cFilCod+cContra+cRevisa)
//Seleciona planilha mais recente
While CNA->CNA_FILIAL == cFilCod .And. CNA->CNA_CONTRA == cContra .And. CNA-
>CNA_REVISA == cRevisa
cNumPla := CNA->CNA_NUMERO
dbSkip()
EndDo

cNumPla := Soma1(cNumPla)

RestArea(aArea)
Return cNumPla

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200Grv � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Grava a planilha e os itens
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200Grv(nExp01,oExp02)
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � nExp01 - Opcao selecionada
��� � oExp02 - Getdados dos itens
��� � aExp03 - Verifica se e rotina automatica
��� � aExp04 - Array Cabecalho para Rotina Automatica
��� � aExp05 - Array Itens para Rotina Automatica
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200Grv(nOpc,oGetDados,lC200Auto,aHeadAuto,aColsAuto,aRatPlan,aLocais)

Local nCntFor := 0
Local nTam := 0
Local nUsado := 0
Local nCntFor2 := 0
Local nItem := 0
Local nTot := 0
Local nTotAnt := 0
Local nQtAtd := 0
Local nX := 0
Local nPosItm := 0
Local nVlComs := 0

Local cFilCod := ""


Local cFilSC1 := ""
Local cItms := ""
Local cFilCNS := ""
Local cAlias := ""
Local cQuery := ""

Local aHeader := {}
Local aCols := {}
Local aItms := {}

Local lCronog := .F.


Local lFisico := .F.
Local lFilOri := CNB->(FieldPos("CNB_FILORI")) > 0

DEFAULT lC200Auto := .F.


DEFAULT aHeadAuto := {}
DEFAULT aColsAuto := {}
DEFAULT aLocais := {}
DEFAULT aRatPlan := {}

aHeader := IIf(lC200Auto,aHeadAuto,oGetDados:aHeader)
aCols := IIf(lC200Auto,aColsAuto,oGetDados:aCols)

Do Case
Case nOpc == 3 // Inclusao

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos do cabecalho �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNA")
Reclock("CNA",.T.)
For nCntFor := 1 To FCount()
If (FieldName(nCntFor)=="CNA_FILIAL")
CNA->CNA_FILIAL := xFilial()
Else
FieldPut(nCntFor,M->&(FieldName(nCntFor)))
EndIf
Next nCntFor
MsUnlock()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","01","CNTA200")

dbSelectArea("CNB")
nUsado := Len(aHeader)
cFilCod := xFilial("CNB")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos dos itens �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
For nCntFor := 1 To Len(aCols)
If ( !aCols[nCntFor][nUsado+1] )
dbSelectArea("CNB")
Reclock("CNB",.T.)
For nCntFor2 := 1 To nUsado
If ( aHeader[nCntFor2][10] != "V" )
FieldPut(FieldPos(aHeader[nCntFor2]
[2]),aCols[nCntFor][nCntFor2])
EndIf
Next nCntFor2
CNB->CNB_FILIAL := cFilCod
If CNB->(FieldPos("CNB_FILORI")) > 0
CNB->CNB_FILORI := cFilCod
EndIf
CNB->CNB_NUMERO := CNA->CNA_NUMERO
CNB->CNB_REVISA := CNA->CNA_REVISA
CNB->CNB_CONTRA := CNA->CNA_CONTRA
CNB->CNB_DTCAD := dDataBase
CNB->CNB_SLDMED := CNB->CNB_QUANT
CNB->CNB_SLDREC := CNB->CNB_QUANT
nTot += (CNB->CNB_QUANT*CNB->CNB_VLUNIT)-CNB-
>CNB_VLDESC
MsUnlock()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","02","CNTA200")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Atualiza solicitacao de compra �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � �
If !Empty(CNB->CNB_NUMSC)
If lFilOri .And. !Empty(CNB->CNB_FILORI)
cFilSC1 := xFilial("SC1",CNB->CNB_FILORI)
Else
cFilSC1 := xFilial("SC1")
EndIf
dbSelectArea("SC1")
If dbSeek(cFilSC1+CNB->CNB_NUMSC+CNB->CNB_ITEMSC)
RecLock("SC1",.F.)
SC1->C1_FLAGGCT := "1" //Solicitacao
bloqueada para SIGAGCT
MsUnlock()
EndIf
EndIf
EndIf
Next

//Atualiza valor total do cabecalho


Reclock("CNA",.F.)
CNA->CNA_VLTOT := nTot
CNA->CNA_SALDO := nTot
MsUnlock()

//Atualiza valor inicial,atual e saldo do contrato


dbSelectArea("CN9")
If dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)
RecLock("CN9",.F.)
CN9->CN9_VLINI += nTot
CN9->CN9_VLATU += nTot
CN9->CN9_SALDO += nTot
MsUnlock()
EndIf

Case nOpc == 4 //Alteracao


lCronog := !Empty(CNA->CNA_CRONOG)

If lCronog
dbSelectArea("CN9")
dbSetOrder(1)
dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o contrato possui cronograma fisico �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
lFisico := ((CN1->(FieldPos("CN1_CROFIS")) > 0) .And.
Posicione("CN1",1,xFilial("CN1")+CN9->CN9_TPCTO,"CN1_CROFIS") == "1")
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Apaga os itens da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNB")
dbSetOrder(1)
If dbSeek(xFilial()+CNA->CNA_CONTRA+CNA->CNA_REVISA+CNA->CNA_NUMERO)
cFilCod := xFilial("CNB")
While !Eof() .And. CNB->CNB_FILIAL = cFilCod .And. CNB-
>CNB_CONTRA == CNA->CNA_CONTRA .And. CNB->CNB_REVISA == CNA->CNA_REVISA .And. CNB-
>CNB_NUMERO == CNA->CNA_NUMERO
If !Empty(CNB->CNB_ITEMSC)
If lFilOri .And. !Empty(CNB->CNB_FILORI)
cFilSC1 := xFilial("SC1",CNB->CNB_FILORI)
Else
cFilSC1 := xFilial("SC1")
EndIf
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � Ŀ
// � Retira quantidade atendida da solicitacao de
compra �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("SC1")
dbSetOrder(1)
If dbSeek(cFilSC1+CNB->CNB_NUMSC+CNB->CNB_ITEMSC)
RecLock("SC1")
SC1->C1_FLAGGCT := ""
MsUnlock()
EndIf
EndIf

//-- Deleta localizacao fisica


If AliasInDic("AGW")
AGW->(dbSetOrder(2))
If AGW->(dbSeek(xFilial("AGW")+CNB-
>(CNB_CONTRA+CNB_NUMERO+CNB_ITEM)))
RecLock("AGW",.F.)
AGW->(dbDelete())
AGW->(MsUnLock())
EndIf
EndIf

RecLock("CNB", .F.)
dbDelete()
MsUnLock()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Exclui o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","02","CNTA200",.T.)

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Armazena itens no array para controle do cronograma
// � fisico
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lFisico
aAdd(aItms,CNB->CNB_ITEM)
EndIf

dbSelectArea("CNB")
dbSkip()
EndDo
EndIf

//Armazena valor total antigo da planilha


nTotAnt := CNA->CNA_VLTOT

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNA")
Reclock("CNA",.F.)
For nCntFor := 1 To FCount()
If (FieldName(nCntFor)=="CNA_FILIAL")
CNA->CNA_FILIAL := xFilial()
Else
FieldPut(nCntFor,M->&(FieldName(nCntFor)))
EndIf
Next nCntFor
MsUnlock()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","01","CNTA200")

dbSelectArea("CNB")
nUsado := Len(aHeader)
cFilCod := xFilial("CNB")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos dos itens �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
For nCntFor := 1 To Len(aCols)
If ( !aCols[nCntFor][nUsado+1] )
dbSelectArea("CNB")
Reclock("CNB",.T.)
For nCntFor2 := 1 To nUsado
If ( aHeader[nCntFor2][10] != "V" )
FieldPut(FieldPos(aHeader[nCntFor2]
[2]),aCols[nCntFor][nCntFor2])
EndIf
Next nCntFor2
CNB->CNB_FILIAL := cFilCod
If CNB->(FieldPos("CNB_FILORI")) > 0
CNB->CNB_FILORI := CN9->CN9_FILORI
EndIf
CNB->CNB_NUMERO := CNA->CNA_NUMERO
CNB->CNB_REVISA := CNA->CNA_REVISA
CNB->CNB_CONTRA := CNA->CNA_CONTRA
CNB->CNB_SLDMED := CNB->CNB_QUANT
CNB->CNB_SLDREC := CNB->CNB_QUANT
nTot += (CNB->CNB_QUANT*CNB->CNB_VLUNIT)-CNB-
>CNB_VLDESC
MsUnlock()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","02","CNTA200")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Atualiza solicitacao de compra �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � �
If !Empty(CNB->CNB_NUMSC)
If lFilOri .And. !Empty(CNB->CNB_FILORI)
cFilSC1 := xFilial("SC1",CNB->CNB_FILORI)
Else
cFilSC1 := xFilial("SC1")
EndIf
dbSelectArea("SC1")
If dbSeek(cFilSC1+CNB->CNB_NUMSC+CNB->CNB_ITEMSC)
RecLock("SC1",.F.)
SC1->C1_FLAGGCT := "1"
MsUnlock()
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o item foi incluido na planilha
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lFisico .And. (nPosItm := aScan(aItms,CNB->CNB_ITEM)) ==
0
If Empty(cAlias)//Verifica se o alias do cronograma
ja foi criado
dbSelectArea("CNF")
dbSetOrder(2)

cQuery := "SELECT CNF.CNF_PARCEL "


cQuery += " FROM "+RetSQLName("CNF")+" CNF "
cQuery += " WHERE CNF.CNF_FILIAL =
'"+xFilial("CNF")+"'"
cQuery += " AND CNF.CNF_CONTRA = '"+CNA-
>CNA_CONTRA+"'"
cQuery += " AND CNF.CNF_REVISA = '"+CNA-
>CNA_REVISA+"'"
cQuery += " AND CNF.CNF_NUMERO = '"+CNA-
>CNA_CRONOG+"'"
cQuery += " AND CNF.D_E_L_E_T_ = ' '"

cAlias := GetNextAlias()
cQuery := ChangeQuery( cQuery )
dbUseArea( .T., "TOPCONN", TcGenQry(
,,cQuery ), cAlias, .F., .T. )
EndIf

cFilCNS := xFilial("CNS")
(cAlias)->(dbGoTop())

While !(cAlias)->(Eof())
// � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Insere novo registro no cronograma fisico
para todas �
// � as parcelas

// � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNS")
RecLock("CNS",.T.)
CNS->CNS_FILIAL:=cFilCNS
CNS->CNS_CONTRA:=CNA->CNA_CONTRA
CNS->CNS_REVISA:=CNA->CNA_REVISA
CNS->CNS_CRONOG:=CNA->CNA_CRONOG
CNS->CNS_PARCEL:=(cAlias)->CNF_PARCEL
CNS->CNS_PLANI :=CNA->CNA_NUMERO
CNS->CNS_ITEM :=CNB->CNB_ITEM
MsUnlock()
(cAlias)->(dbSkip())
EndDo
ElseIf nPosItm > 0
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Quando o item nao foi incluso ou excluso apenas
retira �
// � do array de controle

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � �
aDel(aItms,nPosItm)
aSize(aItms,len(aItms)-1)
EndIf

EndIf
Next

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Finaliza alias do cronograma �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !Empty(cAlias)
(cAlias)->(dbCloseArea())
EndIf
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Verifica se houveram itens excluidos �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lFisico .and. len(aItms) > 0
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta query para buscar os itens do cronograma fisico �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
cItms := ""
For nx:=1 to len(aItms)
cItms += "'"+aItms[nx]+"',"
Next

cQuery := "SELECT CNS.R_E_C_N_O_ AS RECNO "


cQuery += " FROM "+RetSQLName("CNS")+" CNS "
cQuery += " WHERE CNS.CNS_FILIAL = '"+xFilial("CNS")+"'"
cQuery += " AND CNS.CNS_CONTRA = '"+CNA->CNA_CONTRA+"'"
cQuery += " AND CNS.CNS_REVISA = '"+CNA->CNA_REVISA+"'"
cQuery += " AND CNS.CNS_CRONOG = '"+CNA->CNA_CRONOG+"'"
cQuery += " AND CNS.CNS_ITEM IN ("+SubStr(cItms,1,len(cItms)-
1)+")"
cQuery += " AND CNS.D_E_L_E_T_ = ' '"

cAlias := GetNextAlias()
cQuery := ChangeQuery( cQuery )
dbUseArea( .T., "TOPCONN", TcGenQry( ,,cQuery ), cAlias, .F., .T.
)

dbSelectArea("CNS")

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Exclui os itens do cronograma fisico �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
While !(cAlias)->(Eof())
CNS->(dbGoTo((cAlias)->RECNO))
RecLock("CNS",.F.)
dbDelete()
MsUnlock()
(cAlias)->(dbSkip())
EndDo
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche valor total da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Reclock("CNA",.F.)
CNA->CNA_VLTOT := nTot
CNA->CNA_SALDO := nTot
MsUnlock()

//Exclui valor antigo do valor atual

nTot -= nTotAnt

//Atualiza valor inicial,atual e saldo do contrato


dbSelectArea("CN9")
If dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)
RecLock("CN9",.F.)
CN9->CN9_VLINI += nTot
CN9->CN9_VLATU += nTot
CN9->CN9_SALDO += nTot
MsUnlock()
EndIf
Case nOpc == 5 //Exclusao
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Apaga os itens de Rateio por Centro de Custo �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If AliasInDic("CNZ")
dbSelectArea("CNZ")
dbSetOrder(1)
cFilCod := xFilial("CNZ")
If dbSeek(xFilial("CNZ")+CNA->CNA_CONTRA+CNA->CNA_REVISA+CNA-
>CNA_NUMERO)
While !Eof() .And. CNB->CNB_FILIAL = xFilial("CNZ") .And.
CNZ->CNZ_CONTRA == CNA->CNA_CONTRA .And. CNZ->CNZ_REVISA == CNA->CNA_REVISA .And.
CNZ->CNZ_CODPLA == CNA->CNA_NUMERO

RecLock("CNZ", .F.)
dbDelete()
MsUnLock()

dbSelectArea("CNZ")
dbSkip()
EndDo
aRatPlan := {}
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Apaga os itens da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNB")
dbSetOrder(1)
cFilCod := xFilial("CNB")
If dbSeek(cFilCod+CNA->CNA_CONTRA+CNA->CNA_REVISA+CNA->CNA_NUMERO)
While !Eof() .And. CNB->CNB_FILIAL = cFilCod .And. CNB-
>CNB_CONTRA == CNA->CNA_CONTRA .And. CNB->CNB_REVISA == CNA->CNA_REVISA .And. CNB-
>CNB_NUMERO == CNA->CNA_NUMERO
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Exclui o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","02","CNTA200",.T.)

//-- Desbloqueia Solicitacao de Compras


If !Empty(CNB->CNB_ITEMSC)
If lFilOri .And. !Empty(CNB->CNB_FILORI)
cFilSC1 := xFilial("SC1",CNB->CNB_FILORI)
Else
cFilSC1 := xFilial("SC1")
EndIf
dbSelectArea("SC1")
dbSetOrder(1)
If dbSeek(cFilSC1+CNB->CNB_NUMSC+CNB->CNB_ITEMSC)
RecLock("SC1")
SC1->C1_FLAGGCT := ""
MsUnlock()
EndIf
EndIf
RecLock("CNB", .F.)
dbDelete()
MsUnLock()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Exclui o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","02","CNTA200",.T.)

dbSelectArea("CNB")
dbSkip()
EndDo
EndIf

//-- Deleta localizacao fisica


If AliasInDic("AGW")
AGW->(dbSetOrder(2))
AGW->(dbSeek(xFilial("AGW")+CNA->(CNA_CONTRA+CNA_NUMERO)))
While !AGW->(EOF()) .And. AGW->(AGW_FILIAL+AGW_CONTRA+AGW_PLANIL)
== xFilial("AGW")+CNA->(CNA_CONTRA+CNA_NUMERO)
RecLock("AGW")
AGW->(dbDelete())
AGW->(MsUnLock())

AGW->(dbSkip())
End
EndIf

If !Empty(CNA->CNA_CRONOG)
dbSelectArea("CNF")
dbSetOrder(2)
cFilCod := xFilial("CNF")
dbSeek(cFilCod+CNA->CNA_CONTRA+CNA->CNA_REVISA+CNA->CNA_CRONOG)

//Apaga cronograma referente a planilha


While !CNF->(Eof()) .And. CNF->CNF_FILIAL == cFilCod .And. CNF-
>CNF_CONTRA == CNA->CNA_CONTRA .And. CNF->CNF_REVISA == CNA->CNA_REVISA .And. CNF-
>CNF_NUMERO == CNA->CNA_CRONOG
RecLock("CNF",.F.)
dbDelete()
MsUnlock()
CNF->(dbSkip())
EndDo
EndIf

//Atualiza valor inicial,atual e saldo do contrato


dbSelectArea("CN9")
If dbSeek(xFilial("CN9")+CNA->CNA_CONTRA+CNA->CNA_REVISA)
RecLock("CN9",.F.)
CN9->CN9_VLINI -= CNA->CNA_VLTOT
CN9->CN9_VLATU -= CNA->CNA_VLTOT
CN9->CN9_SALDO -= CNA->CNA_VLTOT
MsUnlock()
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Exclui a amarracao com os conhecimentos �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
MsDocument( "CNA", CNA->( RecNo() ), 2, , 3 )

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Apaga cabecalho da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNA")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa o lancamento do SIGAPCO �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
PcoDetLan("000354","01","CNTA200",.T.)

RecLock("CNA", .F.)
dbDelete()
MsUnLock()

EndCase

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Grava localizacoes fisicas (AGW) �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If (nOpc == 3 .Or. nOpc == 4) .And. AliasInDic("AGW")
CNB->(dbSetOrder(1))
AGW->(dbSetOrder(2))
For nCntFor := 1 To Len(aLocais)
CNB->(dbSeek(xFilial("CNB")+CNA->(CNA_CONTRA+CNA_REVISA+CNA_NUMERO)
+aLocais[nCntFor,1]))
If CNB->CNB_BASINS # '1' .Or. (nOpc == 4 .And. !CNB->(Found()))
//-- Tratamento para alteracao do CNB_BASINS
If AGW->(dbSeek(xFilial("AGW")+CNA->(CNA_CONTRA+CNA_NUMERO)+CNB-
>CNB_ITEM))
RecLock("AGW",.F.)
AGW->(dbDelete())
AGW->(MsUnLock())
EndIf
Loop
EndIf

RecLock("AGW",!AGW->(dbSeek(xFilial("AGW")+CNA->(CNA_CONTRA+CNA_NUMERO)
+aLocais[nCntFor,1])))

For nCntFor2 := 1 To Len(aLocais[nCntFor,2])


AGW->&(aLocais[nCntFor,2,nCntFor2,1]) :=
aLocais[nCntFor,2,nCntFor2,2]
Next nCntFor2
AGW->AGW_FILIAL := xFilial("AGW")
AGW->AGW_PRODUT := CNB->CNB_PRODUT

AGW->(MsUnLock())
Next nCntFor
EndIf

If AliasInDic("CNZ") .And. Len(aRatPlan) > 0


GravaCNZ(aRatPlan,oGetDados,nOpc,,,,,,,"CNB")
Endif

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Atualiza valor da comissao para contratos de venda �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If cEspCtr == "2"
cQuery := "SELECT SUM(CNB_VLTOT) AS CNB_VLTOT "
cQuery += " FROM "+RetSQLName("CNB")+" CNB "
cQuery += " WHERE CNB.CNB_FILIAL = '"+xFilial("CNB")+"'"
cQuery += " AND CNB.CNB_CONTRA = '"+CNA->CNA_CONTRA+"'"
cQuery += " AND CNB.CNB_REVISA = '"+CNA->CNA_REVISA+"'"
cQuery += " AND CNB.CNB_FLGCMS = '1' "
cQuery += " AND CNB.D_E_L_E_T_ = ' ' "

cAlias := GetNextAlias()
cQuery := ChangeQuery( cQuery )
dbUseArea( .T., "TOPCONN", TcGenQry( ,,cQuery ), cAlias, .F., .T. )

TCSetField( cAlias, "CNB_VLTOT", "N", TamSx3("CNB_VLTOT")[1],


TamSx3("CNB_VLTOT")[2] )

If !(cAlias)->(Eof())
RecLock("CNA",.F.)
CNA->CNA_VLCOMS := (cAlias)->CNB_VLTOT
MsUnlock()
EndIf

(cAlias)->( dbCloseArea() )
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa PE apos a gravacao �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200GRP")
ExecBlock("CN200GRP",.F.,.F.,{nOpc})
EndIf

Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200FilFor � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Rotina de filtro da consulta padrao para filtrar apenas os
��� � fornecedores do contrato
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � nOpc - Opcao selecionada
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200FilFor()
Local lRet := .F.
Local cProg := FunName()
Local cRevisa := ""
Local lRev := CNC->(FieldPos("CNC_REVISA")) > 0

Do Case
case cProg == "CNTA200" .OR. cProg == "CNTA100"
If !lContrEd
cRevisa := M->CNA_REVISA
lRet := CNC->(dbSeek(xFilial("CNC")+M-
>CNA_CONTRA+If(lRev,cRevisa,"")+SA2->A2_COD+SA2->A2_LOJA))
Else
lRet := (aScan(aForn,{|x| x[1] == SA2->A2_COD .And. x[2] == SA2-
>A2_LOJA}) > 0)
EndIf
case cProg == "CNTA120"
cRevisa := M->CND_REVISA
lRet := CNC->(dbSeek(xFilial("CNC")+M->CND_CONTRA+If(lRev,cRevisa,"")
+SA2->A2_COD+SA2->A2_LOJA))
case cProg == "CNTA090"
cRevisa := M->CN8_REVISA
lRet := CNC->(dbSeek(xFilial("CNC")+M->CN8_CONTRA+If(lRev,cRevisa,"")
+SA2->A2_COD+SA2->A2_LOJA))
case cProg == "CNTA220"
cRevisa := Posicione("CN9",1,xFilial("CNC")+M->CNM_CONTRA,"CN9_REVATU")
lRet := CNC->(dbSeek(xFilial("CNC")+M->CNM_CONTRA+If(lRev,cRevisa,"")
+SA2->A2_COD+SA2->A2_LOJA))
OtherWise
lRet := .T.
End Case
Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200VldNum � Autor � Marcelo Custodio � Data � 28.11.2005
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Verifica numero da planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200VldNum()
Local lRet := .T.
Local aArea := GetArea()

dbSelectArea("CNA")

If INCLUI
If dbSeek(xFilial("CNA")+M->CNA_NUMERO+M->CNA_REVISA+M->CNA_NUMERO)
Help(" ",1,"CNTA200JAE") //"N � mero de planilha j � existente"
lRet := .F.
EndIf
Else
If M->CNA_NUMERO != CNA->CNA_NUMERO .And. dbSeek(xFilial("CNA")+M-
>CNA_NUMERO+M->CNA_REVISA+M->CNA_NUMERO)
Help(" ",1,"CNTA200JAE") //"N � mero de planilha j � existente"
lRet := .F.
EndIf

EndIf

RestArea(aArea)
Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200VldDini � Autor � Marcelo Custodio � Data �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Verifica data de inicio da planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200VldDini()

Local dTIniCtr := CtoD("")


Local dTFimCtr := CtoD("")
Local dDtFim := CtoD("")
Local lRet := .T.
Local oModel := FWModelActive()
Local lMVC := ValType(oModel) <> "U" .And. nModulo <> 28

If lMVC
dTIniCtr := oModel:GetModel("CN9MASTER"):GetValue("CN9_DTINIC") // Data
Inicio do contrato
dTFimCtr := oModel:GetModel("CN9MASTER"):GetValue("CN9_DTFIM") // Data
final do contrato
dDtFim := oModel:GetModel("CNADETAIL"):GetValue("CNA_DTFIM") //
Data final da planilha
Else
dTIniCtr := CN9->CN9_DTINIC // Data final do contrato
dTFimCtr := CN9->CN9_DTFIM // Data inicio do contrato
dDtFim := M->CNA_DTFIM // Data final da planilha
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Posiciona no arquivo de contrato �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !lMVC .And. ( CN9->CN9_NUMERO != M->CNA_CONTRA .And. CN9->CN9_REVISA != M-
>CNA_REVISA )
CN9->(dbSetOrder(1))
CN9->(dbSeek(xFilial("CN9")+M->CNA_CONTRA+M->CNA_REVISA))

dTIniCtr := CN9->CN9_DTINIC // Data final do contrato


dTFimCtr := CN9->CN9_DTFIM // Data inicio do contrato
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica data de inicio em relacao ao contrato �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ( Type("dCN9FIM") != "U" ) .And. dCN9FIM != NIL
If M->CNA_DTINI < dTIniCtr .Or. M->CNA_DTINI > dCN9FIM
Help(" ",1,"CNTA200DTI") //"Data de in � cio inv � lida"
lRet := .F.
EndIf
Else
If M->CNA_DTINI < dTIniCtr .Or. M->CNA_DTINI > dTFimCtr
Help(" ",1,"CNTA200DTI") //"Data de in � cio inv � lida"
lRet := .F.
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica data de inicio em relacao a data de termino �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !Empty(dDtFim) .And. M->CNA_DTINI > dDtFim
Help(" ",1,"CNTA200MEN") //"A data de in � cio n � o pode ser menor que a data
final da planilha"
lRet := .F.
EndIf
Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200VldDfim � Autor � Marcelo Custodio � Data �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Verifica data de termino da planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200VldDfim()

Local dTIniCtr := CtoD("")


Local dTFimCtr := CtoD("")
Local dDtIni := CtoD("")
Local lRet := .T.
Local oModel := FWModelActive()
Local lMVC := ValType(oModel) <> "U" .And. nModulo <> 28

If lMVC
dTIniCtr := oModel:GetModel("CN9MASTER"):GetValue("CN9_DTINIC") //
Data Inicio do contrato
dTFimCtr := oModel:GetModel("CN9MASTER"):GetValue("CN9_DTFIM") //
Data final do contrato
dDtIni := oModel:GetModel("CNADETAIL"):GetValue("CNA_DTINI")
// Data final da planilha
Else
dTIniCtr := CN9->CN9_DTINIC // Data final do contrato
dTFimCtr := CN9->CN9_DTFIM // Data inicio do contrato
dDtIni := M->CNA_DTINI // Data final da planilha
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Posiciona no arquivo de contrato �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If !lMVC .AND. (CN9->CN9_NUMERO != M->CNA_CONTRA .And. CN9->CN9_REVISA != M-
>CNA_REVISA)
CN9->(dbSetOrder(1))
CN9->(dbSeek(xFilial("CN9")+M->CNA_CONTRA+M->CNA_REVISA))
dTIniCtr := CN9->CN9_DTINIC // Data final do contrato
dTFimCtr := CN9->CN9_DTFIM // Data inicio do contrato
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica data de termino em relacao ao contrato �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ( Type("dCN9FIM") != "U" ) .AND. dCN9FIM != NIL
If M->CNA_DTFIM < M->CN9_DTINIC .Or. M->CNA_DTFIM > dCN9FIM
Help(" ",1,"CNTA200DTF") //"Data final inv � lida"
lRet := .F.
EndIf
Else
If M->CNA_DTFIM < dTIniCtr .Or. M->CNA_DTFIM > dTFimCtr
Help(" ",1,"CNTA200DTF") //"Data final inv � lida"
lRet := .F.
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica data de termino em relacao a data de inicio �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If lRet .And. !Empty(dDtIni) .And. dDtIni > M->CNA_DTFIM
Help(" ",1,"CNTA200DFM") //"A data final n � o pode ser menor que a data de
in � cio da planilha"
lRet := .F.
EndIf
Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u ncao � CN200Track � Autor � Sergio Silveira � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Faz o tratamento da chamada do System Tracker
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � R e torno � .T. ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Static Function CN200Track( aCols, aHeader )

Local aEnt := {}
Local cKey := M->CNA_CONTRA + M->CNA_REVISA + M->CNA_NUMERO

Local nPosItem := GDFieldPos( "CNB_ITEM", aHeader )


Local nLoop := 0

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Percorre o acols �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
For nLoop := 1 To Len( aCols )
AAdd( aEnt, { "CNB", cKey + aCols[ nLoop, nPosItem ] } )
Next nLoop

MaTrkShow( aEnt )
Return( .T. )

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u ncao � CN200AGrv � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Executa gravacao da planilha nos arrays aPlani e aPlIt,
��� � usados na rotina de inclusao de contratos ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � nExp01 - Opcao atual ���
��� � aExp02 - Array com os cabecalhos das planilhas ���
��� � aExp03 - Array com os itens das planilhas(aCols) ���
��� � oExp04 - Getdados dos itens ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200AGrv(nOpc,aPlani,aPlIt,oGetDados)

Local aHeader := oGetDados:aHeader


Local aCols := oGetDados:aCols
Local aCN200AGRP := {}
Local nPlan := 0
Local nCntFor := 0
Local nTam := 0
Local nCntFor2 := 0
Local nItem := 0
Local nTot := 0
Local nTotAnt := 0
Local nUsado := Len(aHeader)
Local nPosCnaVlt := (CNA->(FieldPos("CNA_VLTOT")))
Local nPosCnaSld := (CNA->(FieldPos("CNA_SALDO")))
Local cFilCod := ""

Do Case
Case nOpc == 3 // Inclusao
dbSelectArea("CNA")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Inclui itens da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aAdd(aPlIt,aClone(aCols))
nPlan := len(aPlani)

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos do cabecalho �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
For nCntFor := 1 To FCount()
If (FieldName(nCntFor)=="CNA_FILIAL")
aPlani[len(aPlani),nCntFor] := xFilial()
Else
aPlani[len(aPlani),nCntFor] := M->&(FieldName(nCntFor))
EndIf
Next nCntFor
dbSelectArea("CNB")
nUsado := Len(aHeader)
cFilCod := xFilial("CNB")

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Calcula total dos itens �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
For nCntFor := 1 To Len(aCols)
If ( !aCols[nCntFor][nUsado+1] )
nTot += (aCols[nCntFor,aScan(aHeader,{|x| AllTrim(x[2]) ==
"CNB_QUANT"})]*aCols[nCntFor,aScan(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})])-
aCols[nCntFor,aScan(aHeader,{|x| AllTrim(x[2]) == "CNB_VLDESC"})]
EndIf
Next

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Atualiza valor total do cabecalho �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aPlani[len(aPlani),nPosCnaVlt] := nTot
aPlani[len(aPlani),nPosCnaSld] := nTot

Case nOpc == 4 //Alteracao


// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Preenche campos do cabecalho �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("CNA")

nPlan := aScan(aplani,{|x| x[CNA->(FieldPos("CNA_NUMERO"))] == M-


>CNA_NUMERO})
For nCntFor := 1 To FCount()
If (FieldName(nCntFor)=="CNA_FILIAL")
aPlani[nPlan,nCntFor] := xFilial()
Else
aPlani[nPlan,nCntFor] := M->&(FieldName(nCntFor))
EndIf
Next nCntFor

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Calcula total dos itens �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
For nCntFor := 1 To Len(aCols)
If ( !aCols[nCntFor][nUsado+1] )
nTot += (aCols[nCntFor,aScan(aHeader,{|x| AllTrim(x[2]) ==
"CNB_QUANT"})]*aCols[nCntFor,aScan(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})])-
aCols[nCntFor,aScan(aHeader,{|x| AllTrim(x[2]) == "CNB_VLDESC"})]
EndIf
Next

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Atualiza valor total do cabecalho �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aPlani[nPlan,nPosCnaVlt] := nTot
aPlani[nPlan,nPosCnaSld] := nTot

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Atualiza itens da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aPlIt[nPlan] := aClone(aCols)
Case nOpc == 5 //Exclusao
dbSelectArea("CNA")

nPlan := aScan(aplani,{|x| x[CNA->(FieldPos("CNA_NUMERO"))] == M-


>CNA_NUMERO})

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Exclui planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aDel(aPlani,nPlan)
aSize(aPlani,len(aPlani)-1)

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Exclui itens da planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aDel(aPlIt,nPlan)
aSize(aPlIt,len(aPlIt)-1)

EndCase

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Executa PE apos a gravacao �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200AGRP")
aCN200AGRP := ExecBlock("CN200AGRP",.F.,.F.,{nOpc,aPlani,aPlIt})
If ValType(aCN200AGRP) == "A"
If Len(aCN200AGRP)>=1 .And. ValType(aCN200AGRP[1]) == "A"
aPlani := aClone(aCN200AGRP[1])
Endif
If Len(aCN200AGRP)>=2 .And. ValType(aCN200AGRP[2]) == "A"
aPlit := aCN200AGRP[2]
Endif
Endif
EndIf

Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u ncao � CN200Conhec � Autor � Sergio Silveira � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Chamada da visualizacao do banco de conhecimento
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200Conhec() ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � Nenhum ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � R e torno � .T. ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/

Static Function CN200Conhec()

Local aRotBack := AClone( aRotina )


Private aRotina := {}

Aadd(aRotina,{ STR0042,"MsDocument", 0 , 2}) // "Conhecim."

MsDocument( "CNA", CNA->( Recno() ), 1 )

aRotina := AClone( aRotBack )

Return( .t. )

/*/
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P r ograma � MenuDef � Autor � Fabio Alves Silva � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Utilizacao de menu Funcional
��� � ���
��� � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � R e torno � Array com opcoes da rotina. ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � Parametros do array a Rotina: ���
��� � 1. Nome a aparecer no cabecalho ���
��� � 2. Nome da Rotina associada ���
��� � 3. Reservado ���
��� � 4. Tipo de Transa � � o a ser efetuada:
��� � 1 - Pesquisa e Posiciona em um Banco de Dados ���
��� � 2 - Simplesmente Mostra os Campos ���
��� � 3 - Inclui registros no Bancos de Dados ���
��� � 4 - Altera o registro corrente ���
��� � 5 - Remove o registro corrente do Banco de Dados ���
��� � 5. Nivel de acesso ���
��� � 6. Habilita Menu Funcional ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� DATA � Programador � Manutencao efetuada ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
/*/

Static Function MenuDef()


PRIVATE aRotina := { { OemToAnsi(STR0002), "AxPesqui" , 0, 1, 0, .F.},;
//"Pesquisar"
{ OemToAnsi(STR0003), "CN200Manut", 0, 2, 0,
nil},; //"Visualizar"
{ OemToAnsi(STR0004), "CN200Manut", 0, 3, 0,
nil},; //"Incluir"
{ OemToAnsi(STR0005), "CN200Manut", 0, 4, 0,
nil},; //"Alterar"
{ OemToAnsi(STR0006), "CN200Manut", 0, 5, 0,
nil},; //"Excluir"
{ OemToAnsi(STR0040), "MsDocument", 0, 4, 0,
nil } } //"Conhecimento"

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Ponto de entrada utilizado para inserir novas opcoes no array aRotina �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CNT200MNU")
ExecBlock("CNT200MNU",.F.,.F.)
EndIf
Return(aRotina)

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u ncao � CN200AFld � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Gera array com os campos nao exibidos na get dados
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � nExp01 - Opcao atual ���
��� � lExp02 - Exibe campos de readequacao ���
��� � lExp03 - Exibe campos de realinhamento ���
��� � lExp04 - Informa se a edicao esta sendo realizada pela ���
��� � rotina de inclusao de contrato ���
��� � cExp05 - Especie do contrato - compra/venda ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200AFld(nOpc,lReadq,lReali,lContrEd,cEspCtr)
Local aNoFields :=
{"CNB_FILIAL","CNB_NUMERO","CNB_REVISA","CNB_CODMEN","CNB_OBS","CNB_DTANIV","CNB_CO
NORC","CNB_CONTRA","CNB_DTCAD","CNB_DTPREV","CNB_PERC","CNB_RATEIO","CNB_TIPO","CNB
_ITSOMA","CNB_PRCORI","CNB_QTDORI","CNB_QTRDAC","CNB_QTRDRZ","CNB_PERCAL","CNB_FILH
O"}

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Nao exibe campos referentes aos saldos dos itens durante a inc/alter �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If (nOpc == 3 .Or. nOpc == 4) .Or. lContrEd
aAdd(aNoFields,"CNB_SLDMED")
aAdd(aNoFields,"CNB_SLDREC")
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Nao exibe campos referentes a revisao do tipo realinhamento �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If nOpc == 3 .Or. nOpc == 4 .Or. !lReali .Or. lContrEd
aAdd(aNoFields,"CNB_DTREAL")
aAdd(aNoFields,"CNB_REALI")
aAdd(aNoFields,"CNB_VLTOTR")
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Nao exibe campos referentes a revisao do tipo readequacao �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If nOpc == 3 .Or. nOpc == 4 .Or. !lReadq .Or. lContrEd
aAdd(aNoFields,"CNB_QTREAD")
aAdd(aNoFields,"CNB_VLREAD")
aAdd(aNoFields,"CNB_VLRDGL")
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Verifica especie do contrato, e exclui campo de comissao quando contrato de
compra �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
if cEspCtr == "1"
aAdd(aNoFields,"CNB_FLGCMS")
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Verifica especie do contrato, e exclui campo Tipo Saida quando contrato de
compra �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If FunName()=="CNTA100"
If cEspCtr == "1"
aAdd(aNoFields,"CNB_TS")
Else
aAdd(aNoFields,"CNB_TE")
EndIf
EndIf

Return aNoFields

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u ncao � AjustaSX3 � Autor � Marcelo Custodio � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Funcao utilizada para ajustar o dicionario SX3
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Static Function AjustaSX3()
Local aArea := GetArea()
Local cReserv := " � � " //Permite alterar Usado, Browse e Obrigatorio
Local cValiQtd := 'Positivo() .And. CN140VldQtd() .And. cn200MultT()'
Local cValid := 'Positivo() .And. cn200MultT()'
Local cValidDsc := 'Positivo() .And. M->CNB_DESC <= 100 .And. cn200MultT()'
Local cValidPrd := 'ExistCPO("SB1") .And. CN200VldProd(M->CNB_PRODUT) .And.
cn200MultT()'
Local cIniDT := "StoD('')"
Local cVldRev := "(Vazio().Or.ExistCpo('CN9',M->CNA_CONTRA+M->CNA_REVISA)) .And.
CN200VldCon()"
Local cUsadoCNB := " � � � � � � � � � � � � � � � "
Local cReserCNB := " � � "
Local cRsrItem := " � � "

dbSelectArea("SX3")
dbSetOrder(2)

//Obt � m os campos Reservados e Usados


If dbSeek("CNB_ITEM") .And. SX3->X3_RESERV != cRsrItem
RecLock("SX3",.F.)
SX3->X3_RESERV := cRsrItem
MsUnlock()
EndIf

If dbSeek("CNA_CRONOG") .AND. AllTrim(X3_F3) == "CNF01"


RecLock("SX3",.F.)
SX3->X3_F3 := "CNF"
MsUnlock()
EndIf

If dbSeek("CNB_CONTA") .And. SX3->X3_RESERV != cReserv


RecLock("SX3",.F.)
SX3->X3_RESERV := cReserv
MsUnlock()
EndIf

If dbSeek("CNB_QUANT") .And. SX3->X3_VALID != cValiQtd


RecLock("SX3",.F.)
SX3->X3_VALID := cValiQtd
MsUnlock()
EndIf

If dbSeek("CNB_VLUNIT") .And. SX3->X3_VALID != cValid


RecLock("SX3",.F.)
SX3->X3_VALID := cValid
MsUnlock()
EndIf

If dbSeek("CNB_VLTOT") .And. SX3->X3_VALID != cValid


RecLock("SX3",.F.)
SX3->X3_VALID := cValid
MsUnlock()
EndIf

If dbSeek("C7_DESC1")
cReserv :=SX3->X3_RESERV
If dbSeek("CNB_DESC")
Reclock("SX3",.F.)
SX3->X3_RESERV:= cReserv
MsUnlock()
Endif
Endif

If dbSeek("CNB_TE") .And. Empty(SX3->X3_F3)


RecLock("SX3",.F.)
SX3->X3_F3 := "SF4"
MsUnlock()
EndIf

If dbSeek("CNB_TS") .And. Empty(SX3->X3_F3)


RecLock("SX3",.F.)
SX3->X3_F3 := "SF4"
MsUnlock()
EndIf

If dbSeek("CNB_DESC") .And. SX3->X3_VALID != cValidDsc


RecLock("SX3",.F.)
SX3->X3_VALID := cValidDsc
MsUnlock()
EndIf
If dbSeek("CNB_PRODUT") .And. SX3->X3_VALID != cValidPrd
RecLock("SX3",.F.)
SX3->X3_VALID := cValidPrd
MsUnlock()
EndIf

If dbSeek("CNB_ULTAVA");
.And. Upper(AllTrim(SX3->X3_RELACAO)) != Upper(AllTrim(cIniDT))
RecLock("SX3",.F.)
SX3->X3_RELACAO:= cIniDT
MsUnlock()
EndIf

If dbSeek("CNB_PROXAV");
.And. Upper(AllTrim(SX3->X3_RELACAO)) != Upper(AllTrim(cIniDT))
RecLock("SX3",.F.)
SX3->X3_RELACAO := cIniDT
MsUnlock()
EndIf

If SX3->(dbSeek("CNA_REVISA")) .And. Trim(Upper(SX3->X3_VALID)) != Upper(cVldRev)


RecLock("SX3",.F.)
SX3->X3_VALID := cVldRev
SX3->(MsUnlock())
Endif

If dbSeek("CNB_FILORI") .And. (Upper(AllTrim(SX3->X3_USADO)) !=


Upper(AllTrim(cUsadoCNB)))
RecLock("SX3",.F.)
SX3->X3_USADO := cUsadoCNB
SX3->X3_RESERV := cReserCNB
SX3->(MsUnlock())
EndIf

RestArea(aArea)

Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200PC � Autor � Aline Sebrian � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Exibe Pedido de Compras ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200PC(oExp01) ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � oExp01 - GetDados ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200PC(oGetDados)

Local oDlg
Local oMark
Local cMarca := GetMark()
Local lInverte := .F.
Local lPedido := IF(SuperGetMv("MV_RESTPED")=="S",.T.,.F.)

Local aFields := {}
Local aArea := GetArea()
Local aGrupo := UsrGrComp(RetCodUsr())
Local aAreaSX3 := SX3->(GetArea())
Local aAreaSC7 := SC7->(GetArea())
Local aCpos := {}
Local aMarca := {}
Local aCampos :=
{"C7_OK","C7_NUM","C7_ITEM","C7_PRODUTO","C7_QUANT","C7_PRECO","C7_DESCRI","C7_GRUP
COM"}
Local aButEnc := {}
Local aHeader := oGetDados:aHeader
Local aCols := oGetDados:aCols
Local aMark := {}
Local aFiltro := {}
Local aCab := {}
Local aCN200PED := {}
Local aCN200CRP := {}
Local aCTBEnt := If(FindFunction("CTBEntArr"),CTBEntArr(),{})

Local cAlias := "SC7"


Local cCampoOk := "C7_OK"
Local cCpoPre := If(GetMV("MV_CNPRECO"),"B1_UPRC","B1_CUSTD")
Local cFilSC7 := 'C7_FILIAL == "'+xFilial('SC7')+'" .And. (C7_QUANT-C7_QUJE-
C7_QTDACLA)>0 .AND. C7_RESIDUO=" " .And. C7_TPOP<>"P"'
Local cCadastro := OemToAnsi(STR0054)
Local cCN200PID := ""

Local nOpcA := 0
Local nPosCod := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_PRODUT"})
Local nPosPrc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLUNIT"})
Local nPosQuant := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_QUANT"})
Local nPosTotal := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_VLTOT"})
Local nPosNmSc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_NUMSC"})
Local nPosItSc := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEMSC"})
Local nPosItem := ASCAN(aHeader,{|x| AllTrim(x[2]) == "CNB_ITEM"})
Local nExistIt := 0
Local nDeleta := 0
Local nx := 0
Local ny := 0
Local nTamDesc := TamSX3("CNB_DESC")[2]

Private aGrupoPC := UsrGrComp(RetCodUsr())

If ExistBlock( "CN200PID" )
cCN200PID := ExecBlock( "CN200PID", .F., .F., )
If ValType( cCN200PID ) == "C" .And. !Empty(cCN200PID)
cFilSC7 += IIf(Empty(cFilSC7),"",".And.") + cCN200PID
EndIf
EndIf

dbSelectArea("SC7")
dbSetOrder(1)
Set Filter To &(cFilSC7)
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Monta os botoes da enchoice passando o filtro para ser restaurado na saida da
visualizacao �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
//arrumar
aButEnc := { {"PESQUISA",{|| axPesqui() },OemToAnsi(STR0013)} ,;
//"Pesquisar"
{"ANALITIC",{||C200VisuPC(RecNo())},OemToAnsi(STR0014)} } //"Visualizar" -- Usa
funcao de visualizacao do pedido de compra

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta o Header com os titulos do MsSelect �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
dbSelectArea("SX3")
dbSetOrder(2)
For nx := 1 to Len(aCampos)
If MsSeek(aCampos[nx])
If AllTrim(aCampos[nx])=="C7_OK"
AADD(aCpos,{aCampos[nx],""," ",X3_PICTURE})
Else
AADD(aCpos,{aCampos[nx],"",AllTrim(X3Titulo()),X3_PICTURE})
EndIf
EndIf
Next

dbSelectArea("SX3")
dbSetOrder(1)
MsSeek(cAlias)
While !Eof() .And. SX3->X3_ARQUIVO == cAlias
IF ( SX3->X3_BROWSE=="S".And.SX3->X3_CONTEXT <> "V" .And. X3Uso(SX3-
>X3_USADO).And. Ascan(aCpos,{|x| Alltrim(x[1]) == Alltrim(SX3->X3_CAMPO)})==0 )
Aadd(aCpos,{SX3->X3_CAMPO,"",AllTrim(X3Titulo()),X3_PICTURE})
EndIf
dbSkip()
Enddo

If ExistBlock("CN200CRP")
aCN200CRP := ExecBlock("CN200CRP", .F., .F.)
If ValType(aCN200CRP) == "A"
aCab := aCN200CRP

DbSelectArea("SX3")
DbSetOrder(2)

For nX := 1 to Len(aCab)
If aScan(aCpos,{|x| x[1]= aCab[nX]})==0
If SX3->(MsSeek(aCab[nX]))
Aadd(aCpos,{SX3->X3_CAMPO,SX3->X3_TIPO,SX3-
>X3_CONTEXT,SX3->X3_PICTURE})
EndIf
EndIf
Next nX
EndIf
EndIf

DEFINE MSDIALOG oDlg TITLE cCadastro From 30,30 To 285,600 OF oMainWnd PIXEL
oMark := MsSelect():New(cAlias,cCampoOk,"CN200FLAGPC()",aCpos,@lInverte,@cMarca,
{ 17,2,113,285})
oMark:bMark := {||
CN200AddMark(cMarca,@aMarca,cCampoOk,cAlias),oMark:OBROWSE:Refresh()}

ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{||(nOpcA:=1),(oDlg:End())},{||


oDlg:End()},,aButEnc)

dbSelectArea("SC7")
dbSetOrder(1)
dbClearFilter()

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Monta o aCols com os PCs selecionados �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If nOpcA== 1

For nx := 1 to Len(aMarca)

dbSelectArea(cAlias)
MsGoto(aMarca[nx])

If !( lPedido .And. aScan(aGrupo,SC7->C7_GRUPCOM) <= 0 ) .Or.


Empty(SC7->C7_GRUPCOM)
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Varre o aCols e compara se ja existe o item do PC
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
nExistIT := Ascan(aCols,{|x| x[nPosNmSc] ==
FieldGet(FieldPos(aCampos[2])) .And. x[nPosItSc] ==
FieldGet(FieldPos(aCampos[3]))})

If nExistIT = 0
If aMarca[nx] > 0

nDeleta := Ascan(aCols,{|x| x[nPosCod] = " "})


If nDeleta >0
Adel(aCols,nDeleta)//Exclui linha em branco
Asize(aCols,Len(aCols)-1)
Endif

cItem := IIf(Empty(aCols),StrZero(1,Len(CNB-
>CNB_ITEM)),Soma1(aCols[Len(aCols)][nPosItem]))
AADD(aCols,Array(Len(aHeader)+1))//inclui novo item

For nY := 1 To Len(aHeader)//Preenche os campos


Do Case
Case Trim(aHeader[nY][2]) == "CNB_ITEM"
aCols[Len(aCols)][nY] := cItem
Case Trim(aHeader[nY][2]) == "CNB_NUMERO"
aCols[Len(aCols)][nY] := M-
>CNA_NUMERO
Case Trim(aHeader[nY][2]) ==
"CNB_REVISAO"
aCols[Len(aCols)][nY] := M-
>CNA_REVISAO
Case Trim(aHeader[nY][2]) == "CNB_CONTRA"
aCols[Len(aCols)][nY] := M-
>CNA_CONTRA
Case Trim(aHeader[nY][2]) == "CNB_QUANT"
aCols[Len(aCols)][nY] := SC7-
>C7_QUANT-SC7->C7_QUJE
Case Trim(aHeader[nY][2]) == "CNB_PRODUT"
aCols[Len(aCols)][nY] := SC7-
>C7_PRODUTO
Case Trim(aHeader[nY][2]) == "CNB_QTDSOL"
aCols[Len(aCols)][nY] := SC7-
>C7_QUANT-SC7->C7_QUJE
Case Trim(aHeader[nY][2]) == "CNB_DESCRI"
aCols[Len(aCols)][nY] := SC7-
>C7_DESCRI
Case Trim(aHeader[nY][2]) == "CNB_UM"
aCols[Len(aCols)][nY] := SC7->C7_UM
Case Trim(aHeader[nY][2]) == "CNB_VLUNIT"
aCols[Len(aCols)][nY] := SC7-
>C7_PRECO
Case Trim(aHeader[nY][2]) == "CNB_TE"
aCols[Len(aCols)][nY] := SC7-
>C7_TES
Case Trim(aHeader[nY][2]) == "CNB_CONTA"
aCols[Len(aCols)][nY] := SC7-
>C7_CONTA
Case Trim(aHeader[nY][2]) == "CNB_ITEMCT"
aCols[Len(aCols)][nY] := SC7-
>C7_ITEMCTA
Case Trim(aHeader[nY][2]) == "CNB_CC"
aCols[Len(aCols)][nY] := SC7->C7_CC

Case Trim(aHeader[nY][2]) == "CNB_DESC"


aCols[Len(aCols)][nY] :=
NoRound((SC7->C7_VLDESC/SC7->C7_TOTAL) * 100,nTamDesc)
Case Trim(aHeader[nY][2]) == "CNB_VLDESC"
aCols[Len(aCols)][nY] := SC7-
>C7_VLDESC
Case IsHeadRec(Trim(aHeader[nY][2]))
== .T.
aCols[Len(aCols)][nY] := CNB-
>(Recno())
Case IsHeadAlias(Trim(aHeader[nY][2])) ==
.T.
aCols[Len(aCols)][nY] := "CNB"
OtherWise
aCols[Len(aCols)][nY] :=
CriaVar(aHeader[ny,2])
EndCase
Next nY

For nY := 1 To Len(aCTBEnt)
If GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"CR",aHeader) > 0 .And. SC7->(FieldPos("C7_EC"+aCTBEnt[nY]+"CR")) > 0
aTail(aCols)
[GDFieldPos("CNB_EC"+aCTBEnt[nY]+"CR",aHeader)] := SC7->&("C7_EC"+aCTBEnt[nY]+"CR")
EndIf
If GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"DB",aHeader) > 0 .And. SC7->(FieldPos("C7_EC"+aCTBEnt[nY]+"DB")) > 0
aTail(aCols)
[GDFieldPos("CNB_EC"+aCTBEnt[nY]+"DB",aHeader)] := SC7->&("C7_EC"+aCTBEnt[nY]+"DB")
EndIf
Next nY

aCols[Len(aCols)][nPosTotal] :=
Round(aCols[Len(aCols)][nPosPrc]*aCols[Len(aCols)][nPosQuant], TamSX3("CNB_VLTOT")
[2])
aCols[Len(aCols)][Len(aHeader)+1] := .F.

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Impede que o item da planilha seja deletado pela
getdados �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oGetDados:lNewLine:=.F.

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Varre array para preenchimento.

//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If len(aFields) > 0
For nY := 1 To Len(afields)
If (nposfield:= aScan(aHeader, {|x|
AllTrim(x[2])==afields[nY,1]})) > 0
aCols[len(aCols),nposfield]:=
&(afields[nY,2])
Endif
Next ny
EndIf
EndIf
EndIf
EndIf

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Ponto de entrada executado no carregamento do aCols ao Item da
Planilha �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If ExistBlock("CN200PED")
aCN200PED := ExecBlock("CN200PED",.F.,.F.,
{aHeader,aCols[len(aCols)],aMarca[nx]})
If ValType(aCN200PED) == "A"
aCols[len(aCols)] := aClone(aCN200PED)
EndIf
EndIf
Next
EndIf

oGetDados:Refresh()

RestArea(aAreaSC7)
RestArea(aAreaSX3)

RestArea(aArea)
Return(.T.)
/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200FlagPC � Autor � Aline Sebrian � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida o usuario atraves da pedido de compras selecionado � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � CN200FlagPC() ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200FlagPC()
Local lPedido := IF(SuperGetMv("MV_RESTPED")=="S",.T.,.F.)
Local cFlag := IIf(C7_QUJE>=C7_QUANT,'X',' ')
+If(C7_TPOP=='P'.And.C7_APROV$"R,B",'X',' ');
+If(Empty(SC7->C7_GRUPCOM),' ',If(lPedido.And.aScan(aGrupoPC,SC7->C7_GRUPCOM) <=
0,'X',' '))
Return cFlag

/*/
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F un � � o � C200VisuPC � Autor � Aline Sebrian � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Chama a rotina de visualizacao dos Pedidos de Compras ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � C200VisuPC() ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200 ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
/*/
Function C200VisuPC(nRecSC7)
Local aArea := GetArea()
Local aAreaSC7 := SC7->(GetArea())
Local cSavCadastro := cCadastro
Local cFilBak := cFilAnt
Local lRet := .F.

PRIVATE nTipoPed := 1
PRIVATE cCadastro := OemToAnsi(STR0053)
PRIVATE l120Auto := .F.
PRIVATE aBackSC7 := {} //Sera utilizada na visualizacao do pedido - MATA120
MaFisEnd()

DbSelectArea("SC7")
MsGoto(nRecSC7)
If !EOF() .And. !Empty(SC7->C7_NUM)
cFilAnt := IIf(!Empty(SC7->C7_FILIAL),SC7->C7_FILIAL,cFilAnt)
A120Pedido(Alias(),RecNo(),2)
cFilant := cFilBak
cCadastro := cSavCadastro
lRet := .T.
EndIf

RestArea(aAreaSC7)
RestArea(aArea)

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � AjustaSX1 � Autor � Aline Sebrian � Data
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Configura as perguntas na rotina da planilha do contrato
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � S i ntaxe � AjustaSX1() ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Static Function AjustaSX1()
Local aAreaAnt := GetArea()
PutHelp("PCNTA200PRD",{"Produto inv � lido para o item. ", "Este produto possui
Contrato de"," Parceria."},;
{"Invalid product for the item. ", "This product
has Partnersh.Agreem."},;
{"Producto invalido para el item. ", "fecha de
inicio."},.F.)

PutHelp("SCNTA200PRD",{"Verifique o conte � do do par � metro ", "MV_PRODCTR."},;


{"Check content of the parameter ", "MV_PRODCTR."},;
{"Verifique el contenido del parametro", "MV_PRODCTR."},.F.)

PutHelp("PCNTA200COP",{"Numero do contrato cadastrado na ", " Planilha


divergente ao Contrato. "},;
{"Contract number registered of the ", "Worksheet
if differ than Contract."},;
{"Numero del Contrato registrado en la", "Planilla
es divergente el Contrato"},.F.)

PutHelp("SCNTA200COP",{"Verifique no Contrato."},;
{"Check on Contract."},;
{"Verifique en el Contrato."},.F.)

PutHelp("PCNTA200TS1",{"Tipo Saida somente para Contratos ", "do Tipo Vendas" },;
{"Outflow Type is only for Sales Type ", "
Contracts."},;
{"Tipo Salida solamente pra Contratos ", "del
Tipo"},.F.)

PutHelp("SCNTA200TS1",{"Verifique o registro da Planilha."},;


{"Check the register of the Worksheet."},;
{"Verifique en el Contrato."},.F.)

PutHelp("PCNTA200TS2",{"Tipo Sa � da n � o cadastrada."},;
{"Outflow Type isn't registered."},;
{"Tipo salida no registrado"},.F.)

PutHelp("SCNTA200TS2",{"Verifique o registro da Planilha."},;


{"Check the register of the Worksheet."},;
{"Verifique en el Contrato."},.F.)

PutHelp("PCNTA200TS3",{"Os campos Produto, Quantidade, Valor ","Unit � rio, Un.


Medida ou TES est � o", " em Branco. "},;
{"The Product, Quantity, Unit price, UM ","or TIO
fields are in Blank." },;
{"Los campos PRODUCTO, CANTIDAD, PRECIO ","PRECIO
UNITARIO or UM est � n vac � os."},.F.)

PutHelp("SCNTA200TS3",{"Verifique o registro da Planilha."},;


{"Check the register of the Worksheet."},;
{"Verifique el registro da Planilla."},.F.)

PutHelp("PCNTA200TE1",{"Tipo Entrada somente para Contratos ", "do Tipo


Compras" },;
{"`Inflow � type is only for Purchase ", "Type
Contracts."},;
{"Tipo Entrada solamente para el ", "Contrato
Tipo Compras"},.F.)

PutHelp("SCNTA200TE1",{"Verifique o registro da Planilha."},;


{"Check the register of the Worksheet."},;
{"Verifique el registro da Planilla."},.F.)

PutHelp("PCNTA200TE2",{"Os campos Produto, Quantidade, Valor", "Unit � rio ou Un.


Medida est � o em Branco."},;
{"The Product, Quantity ,Unit price or", "UM fields
are in Blank." },;
{"Los campos PRODUCTO,CANTIDAD, PRECIO", "UNITARIO
or UM est � n vac � os."},.F.)

PutHelp("SCNTA200TE2",{"Verifique o registro da Planilha."},;


{"Check the register of the Worksheet."},;
{"Verifique el registro da Planilla."},.F.)

RestArea(aAreaAnt)
Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � cn200VldTS � Autor � Aline Sebrian � Data � 14.01.2010
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida Tipo Saida na Planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function cn200VldTS()
Local cReadVar := ReadVar()
Local xConteudo := &(cReadVar)
Local lRet := .T.
Local cEspecie := ""

If CN9->( FieldPos("CN9_ESPCTR") ) > 0


cEspecie := CN9->CN9_ESPCTR
Else
cEspecie := iIf(Type("cEspCtr") == "C",cEspCtr,iIf(Empty(CN9-
>CN9_CLIENT),"1","2"))
EndIf

dbSelectArea("SF4")
dbSetOrder(1)
MsSeek(xFilial("SF4")+xConteudo)

If SF4->(Found())
If xConteudo < "500"
Help (" ",1,"A410NOTES")
lRet := .F.
EndIf

If lRet .And. cEspecie=="1"


Help (" ",1,"CNTA200TS1")//"Tipo Saida somente para Contratos do Tipo
Vendas"
lRet := .F.
EndIf
Else
Help (" ",1,"CNTA200TS2")//"Tipo Saida n � o cadastrada"
lRet := .F.
EndIf

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � cn200VldTe � Autor � Aline Sebrian � Data � 14.01.2010
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida Tipo Entrada na Planilha
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function cn200VldTE()
Local cReadVar := ReadVar()
Local xConteudo := &(cReadVar)
Local lRet := .T.
Local cEspecie := ""

If CN9->( FieldPos("CN9_ESPCTR") ) > 0


cEspecie := FWFldGet("CN9_ESPCTR")
Else
cEspecie := iIf(Type("cEspCtr") == "C",cEspCtr,iIf(Empty(CN9-
>CN9_CLIENT),"1","2"))
EndIf
dbSelectArea("SF4")
dbSetOrder(1)
MsSeek(xFilial("SF4")+xConteudo)

If SF4->(Found())
If xConteudo > "500"
Help (" ",1,"A410NOTES")
lRet := .F.
EndIf

If lRet
If cEspecie == "2"
Help (" ",1,"CNTA200TE1")//"Tipo Entrada somente para Contratos
do Tipo Compras"
lRet := .F.
EndIf
EndIf
EndIf

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F un � � o � AjustaSX7 � Autor � Aline Sebrian � Data � 11/02/11
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Funcao de processamento da gravacao do SX7
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Static Function AjustaSX7()
Local aSX7 := {}
Local aEstrut:= {}
Local i := 0
Local j := 0
Local lSX7 := .F.

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Preencha a matriz aSX7 com os campos a serem criados. Utilize a mesma ordem
indicada na �
// � matriz aEstrut

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
aEstrut :=
{"X7_CAMPO","X7_SEQUENC","X7_REGRA","X7_CDOMIN","X7_TIPO","X7_SEEK","X7_ALIAS","X7_
ORDEM","X7_CHAVE","X7_CONDIC","X7_PROPRI"}

DbSelectArea("SX7")
DbSetOrder(1)

aAdd(aSX7,{"CNB_PRODUT","004",'If(Empty(M->CNA_CLIENT),SB1-
>B1_TE,"")',"CNB_TE","P","S","SB1",1,'xFilial("SB1")+M->CNB_PRODUT',"","S"})
aAdd(aSX7,{"CNB_PRODUT","005",'If(!Empty(M->CNA_CLIENT),SB1-
>B1_TS,"")',"CNB_TS","P","S","SB1",1,'xFilial("SB1")+M->CNB_PRODUT',"","S"})
dbSelectArea("SX7")
dbSetOrder(1)
For i:= 1 To Len(aSX7)
If !Empty(aSX7[i][2])
If !dbSeek(aSX7[i,1]+aSX7[i,2])
lSX7 := .T.

RecLock("SX7",.T.)
For j:=1 To Len(aSX7[i])
If !Empty(FieldName(FieldPos(aEstrut[j])))
FieldPut(FieldPos(aEstrut[j]),aSX7[i,j])
EndIf
Next j

dbCommit()
MsUnLock()
EndIf
EndIf
Next i

If SX7->(dbSeek("CNB_DESC 001")) .And. !("Empty(M->CNA_CLIENT)"$ SX7->X7_CONDIC)


RecLock("SX7", .F.)
SX7->X7_CONDIC := "Empty(M->CNA_CLIENT)"
MsUnlock()
EndIf

Return

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200VldProd � Autor � Allyson Freitas � Data �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida permissao de Produto
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � P a rametros � cProd: Produto
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200VldProd(cProd)
Local lRet := .T.
Local aCTBEnt := If(FindFunction("CTBEntArr"),CTBEntArr(),{})
Local oObj := Nil
Local nY
Local oModel := FWModelActive()
Local lMVC := ValType(oModel) <> "U" .And. nModulo <> 28

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o usuario tem permissao de inclusao. �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If Inclui
If (VAL(GetVersao(.F.)) == 11 .And. GetRpoRelease() >= "R6" .Or.
VAL(GetVersao(.F.)) > 11) .And. FindFunction("MaAvalPerm")
lRet := MaAvalPerm(1,{cProd,"CNT200",3})
If !lRet
Help(,,1,'SEMPERM')
EndIf
EndIf
EndIf

SB1->(dbSeek(xFilial("SB1")+cProd))
If !lMVC
oObj := If(FunName() == "CNTA140",oGetDad1,oGetDados)
For nY := 1 To Len(aCTBEnt)
If GDFieldPos("CNB_EC"+aCTBEnt[nY]+"CR",oObj:aHeader) > 0 .And. SB1-
>(FieldPos("B1_EC"+aCTBEnt[nY]+"CR")) > 0
aTail(oObj:aCols)[GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"CR",oObj:aHeader)] := SB1->&("B1_EC"+aCTBEnt[nY]+"CR")
EndIf
If GDFieldPos("CNB_EC"+aCTBEnt[nY]+"DB",oObj:aHeader) > 0 .And. SB1-
>(FieldPos("B1_EC"+aCTBEnt[nY]+"DB")) > 0
aTail(oObj:aCols)[GDFieldPos("CNB_EC"+aCTBEnt[nY]
+"DB",oObj:aHeader)] := SB1->&("B1_EC"+aCTBEnt[nY]+"DB")
EndIf
Next nY
EndIf

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200FldOk � Autor � Allyson Freitas � Data �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida permissao de Produto
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200FldOk()
Local lRet := .T.
Local cFieldCNB := ReadVar()
Local cFieldEdit := SubStr(cFieldCNB,4,Len(cFieldCNB))
Local nPProduto := 0
Local oModel := FWModelActive()
Local oModelCNB := Nil
Local lMVC := ValType(oModel) <> "U" .And. nModulo <> 28

If Altera
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o usuario tem permissao de alteracao. �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If cFieldEdit $ "CNB_PRODUT"
If (VAL(GetVersao(.F.)) == 11 .And. GetRpoRelease() >= "R6" .Or.
VAL(GetVersao(.F.)) > 11) .And. FindFunction("MaAvalPerm")
If !lMVC
nPProduto := aScan(aHeader,{|x| AllTrim(x[2])==
"CNB_PRODUT"})
If !(lRet := MaAvalPerm(1,{aCols[n][nPProduto],"CNT200",5})
.And. MaAvalPerm(1,{cCampo,"CNT200",3}))
Help(,,1,'SEMPERM')
EndIf
Else
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Tratamentos para interface em MVC �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oModelCNB := oModel:GetModel("CNBDETAIL")
lRet := MaAvalPerm(1,
{oModelCNB:GetValue("CNB_PRODUT"),"CNT200",5}) .And. MaAvalPerm(1,
{oModelCNB:GetValue("CNB_PRODUT"),"CNT200",3})
If !lRet
Help(,,1,'SEMPERM')
EndIf
EndIf
EndIf
Else
If (VAL(GetVersao(.F.)) == 11 .And. GetRpoRelease() >= "R6" .Or.
VAL(GetVersao(.F.)) > 11) .And. FindFunction("MaAvalPerm")
If !lMVC
nPProduto := aScan(aHeader,{|x| AllTrim(x[2])==
"CNB_PRODUT"})
If !(lRet := MaAvalPerm(1,{aCols[n]
[nPProduto],"CNT200",4}))
Help(,,1,'SEMPERM')
EndIf
Else
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Tratamentos para interface em MVC �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oModelCNB := oModel:GetModel("CNBDETAIL")
lRet := lRet := MaAvalPerm(1,
{oModelCNB:GetValue("CNB_PRODUT"),"CNT200",4})
If !lRet
Help(,,1,'SEMPERM')
EndIf
EndIf
EndIf
EndIF
EndIf

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u n � ao � CN200DelOk � Autor � Allyson Freitas � Data �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � ao � Valida permissao de Produto
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � Uso � CNTA200
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function CN200DelOk()
Local lRet := .T.
Local nPProduto := 0
Local oModel := FWModelActive()
Local oModelCNB := Nil
Local lMVC := ValType(oModel) <> "U" .And. nModulo <> 28

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
// � Verifica se o usuario tem permissao de exclusao. �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
If (VAL(GetVersao(.F.)) == 11 .And. GetRpoRelease() >= "R6" .Or.
VAL(GetVersao(.F.)) > 11) .And. FindFunction("MaAvalPerm")

If !lMVC

nPProduto := aScan(aHeader,{|x| AllTrim(x[2])== "CNB_PRODUT"})

If !(lRet := MaAvalPerm(1,{aCols[n][nPProduto],"CNT200",5}))
Help(,,1,'SEMPERM')
EndIf

Else

// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Tratamentos para interface em MVC �
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oModelCNB := oModel:GetModel("CNBDETAIL")

If !(lRet := MaAvalPerm(1,
{oModelCNB:GetValue("CNB_PRODUT"),"CNT200",5}))
Help(,,1,'SEMPERM')
EndIf

EndIf

EndIf

Return lRet

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � F u ncao � cn200MultT � Autor � Aline S Damasceno � Data � 03/02/12
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � D e scri � � o � Efetua a Validacao dos campos digitados quanto a
��� � ,preco, desconto e quantidade liberada. ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � R e torno � Logico ���
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
*/
Function cn200MultT()
Local aArea := GetArea()
Local cEspecie := ""
Local oObj := Nil
Local nPVlUnit := 0
Local nPVlTot := 0
Local nPVlDesc := 0
Local nPOVlDesc := 0
Local nPDescont := 0
Local nPODescont := 0
Local nPQuant := 0
Local nPQtdOri := 0
Local nPTES := 0
Local nX := 0
Local nTotal := 0
Local lRetorno := .T.
Local cReadVar := ReadVar()
Local xConteudo := &(cReadVar)
Local oModel := FWModelActive()
Local oModelCNB := Nil
Local lMVC := ValType(oModel) <> "U" .And. nModulo <> 28
Local nValDesc := 0
Local aSaveLines := FWSaveRows()

If !lMVC

cEspecie := iIf(Type("cEspCtr") == "C",cEspCtr,iIf(Empty(CN9-


>CN9_CLIENT),"1","2"))

oObj := If(FunName() == "CNTA140",oGetDad1,oGetDados)

If !( Type("lC200Auto") != "U" .And. lC200Auto )


nPVlUnit:= aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_VLUNIT"})
nPVlTot := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_VLTOT"})
nPQuant := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_QUANT"})
nPQtdOri:= aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_QTDORI"})
nPTES := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_TES"})
EndIf

If cEspecie=="2" .And. (!( Type("lC200Auto") != "U" .And. lC200Auto )) .And.


(FunName() == "CNTA140")
nPVlDesc := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNBNVLDESC"})
nPDescont := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNBNDESC"})
nPODescont := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNBDESC"})
nPOVlDesc := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNBVLDESC"})

Do Case
Case "CNBNDESC"$cReadVar
If FindFunction("FtDescItem")

FtDescItem(0,@oObj:aCols[n,nPVlUnit],IIF(oObj:aCols[n,nPQtdOri]>0,@oObj:aCols[n,nPQ
tdOri],@oObj:aCols[n,nPQuant]),0,@xConteudo,@oObj:aCols[n,nPVlDesc],0,1,,)
EndIf

Case "CNB_QUANT"$cReadVar
If FindFunction("FtDescItem")

FtDescItem(0,@oObj:aCols[n,nPVlUnit],IIF(oObj:aCols[n,nPQtdOri]>0,@oObj:aCols[n,nPQ
tdOri],@oObj:aCols[n,nPQuant]),0,@oObj:aCols[n,nPODescont],@oObj:aCols[n,nPOVlDesc]
,0,1,,)
oObj:aCols[n,nPDescont] := oObj:aCols[n,nPODescont]
oObj:aCols[n,nPVlDesc] := oObj:aCols[n,nPOVlDesc]
EndIf
EndCase
EndIf
//Tratamento para contrato do tipo vendas
If cEspecie=="2" .And. (!( Type("lC200Auto") != "U" .And. lC200Auto )) .And.
(FunName() <> "CNTA140")
nPVlDesc := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_VLDESC"})
nPDescont := aScan(oObj:aHeader,{|x| AllTrim(x[2])=="CNB_DESC"})

Do Case
Case "CNB_VLUNIT"$cReadVar
oObj:aCols[n,nPVlDesc] := 0
oObj:aCols[n,nPDescont]:= 0

Case "CNB_QUANT"$cReadVar
oObj:aCols[n,nPVlDesc] := 0
oObj:aCols[n,nPDescont]:= 0

Case "CNB_DESC"$cReadVar
If FindFunction("FtDescItem")

FtDescItem(0,@oObj:aCols[n,nPVlUnit],@oObj:aCols[n,nPQuant],0,@xConteudo,@oObj:aCol
s[n,nPVlDesc],0,1,,)
EndIf
EndCase
EndIf
Else
// � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � Ŀ
// � Tratamentos para interface em MVC �
//� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
oModelCNB := oModel:GetModel("CNBDETAIL")
cEspecie := FwFldGet("CN9_ESPCTR")

If lRetorno .And. Posicione("CN1",1,xFilial("CN1")


+FWFldGet("CN9_TPCTO"),"CN1_CROFIS") == "1" .And. "CNB_PRODUT" $ ReadVar()
For nX := 1 To oModel:GetModel("CNFDETAIL"):Length()
oModel:GetModel("CNFDETAIL"):GoLine(nX)
If !oModel:GetModel("CNFDETAIL"):IsDeleted() .And. !
Empty(oModel:GetModel("CNFDETAIL"):GetValue("CNF_COMPET"))
If oModel:GetModel("CNSDETAIL"):Length() <
Val(FWFldGet("CNB_ITEM"))
Exit
EndIf
oModel:GetModel("CNSDETAIL"):GoLine(oModelCNB:GetLine())
oModel:GetModel("CNSDETAIL"):LoadValue("CNS_PRODUT",M-
>CNB_PRODUT)

oModel:GetModel("CNSDETAIL"):LoadValue("CNS_DESCRI",Posicione("SB1",1,xFilial("SB1"
)+M->CNB_PRODUT,"B1_DESC"))
EndIf
Next nX
EndIf
EndIf

RestArea(aArea)
FWRestRows(aSaveLines)
Return(lRetorno)

/*
��� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
��������������������������������������
������������������������������������������������
��������������������������������������
������������������������������������������������
����������������������������������ͻ��
���Programa � CN200Loca �Autor�Jo�o Gon�alves de Oliveira � Data �
10/02/11 ���
������������������������������������������������
����������������������������������͹͹ ��͹
���Descri��o � Chamada da fun��o de atualiza��o da localiza��o f�sica
���
������������������������������������������������
����������������������������������͹͹ ��͹
���Sintaxe � CN200Loca(ExpO1,ExpC2,ExpC3,ExpC4,ExpC5)
���
������������������������������������������������
����������������������������������͹͹ ��͹
���Par�metros� Nenhum
���
������������������������������������������������
����������������������������������͹͹ ��͹
���Retorno � Nenhum
���
������������������������������������������������
����������������������������������ͼ��
������������������������������������������������
��������������������������������������
������������������������������������������������
��������������������������������������
*/
Function CN200Loca(cContra,cRevisa,cPlanil,oGetDados,aLocais,aPlani,lVisual)
Local nPRODUT := aScan(oGetDados:aHeader,{|x| AllTrim(x[2]) == "CNB_PRODUT"})
Local nQUANT := aScan(oGetDados:aHeader,{|x| AllTrim(x[2]) == "CNB_QUANT"})
Local nBASINS := aScan(oGetDados:aHeader,{|x| AllTrim(x[2]) == "CNB_BASINS"})
Local nITEM := aScan(oGetDados:aHeader,{|x| AllTrim(x[2]) == "CNB_ITEM"})
Local nPosLocal := 0
Local nX := 0
Local nY := 0
Local nPLANIL := 0
Local nITEM2 := 0
Local nCLIENT := 0
Local nLOJA := 0
Local nCODFAB := 0
Local nLOJAFA := 0
Local nPRODUT2 := 0
Local nNUMSER := 0
Local aDadosCtr := {}
Local lBkpINC := INCLUI
Local lBkpALT := ALTERA
Local lConfirm := .F.
Local lValidou := .F.
Local lCntEdit := If(Type("lContrEd") == "L" .And. lContrEd,.T.,.F.)
Local cCliente := If(lCntEdit,M->CN9_CLIENT,Posicione("CN9",1,xFilial("CN9")
+cContra+cRevisa,"CN9_CLIENT"))
Local cLojaCli := If(lCntEdit,M->CN9_LOJACL,Posicione("CN9",1,xFilial("CN9")
+cContra+cRevisa,"CN9_LOJACL"))

Default lVisual := .F.


If AliasInDic("AGW") .And. FindFunction("AT110Man") .And. Len(oGetDados:aCols) > 0
If Empty(oGetDados:aCols[oGetDados:nAt,nPRODUT])
Aviso(STR0059,STR0066,{"OK"}) //-- Informe o c�digo do produto/eqpto.
ElseIf oGetDados:aCols[oGetDados:nAt,nBASINS] <> "1"
Aviso(STR0059,STR0068,{"OK"}) //-- Produto/eqpto n�o configurado para
gera��o de base instalada.
ElseIf Posicione("CNB",1,xFilial("CNB")
+cContra+cRevisa+cPlanil+oGetDados:aCols[oGetDados:nAt,nITEM],"CNB_GERBIN") == "1"
Aviso(STR0059,STR0069,{"OK"}) //-- J� foi gerada base instalada para
este produto/eqpto.
Else
AGW->(dbSetOrder(2))
If lVisual
If AGW->(dbSeek(xFilial("AGW")
+cContra+cPlanil+oGetDados:aCols[oGetDados:nAt,nITEM]))
AT110Man("AGW",AGW-
>(Recno()),2,,,oGetDados:aHeader,oGetDados:aCols)
EndIf
ElseIf (nPosLocal := aScan(aLocais,{|x| x[1] ==
oGetDados:aCols[oGetDados:nAt,nITEM]})) > 0
If !AGW->(dbSeek(xFilial("AGW")
+cContra+cPlanil+oGetDados:aCols[oGetDados:nAt,nITEM]))
INCLUI := .T.
ALTERA := .F.
Else
INCLUI := .F.
ALTERA := .T.
EndIf

If nPosLocal > 0
aDadosCtr := aClone(aLocais[nPosLocal,2])
//-- Tratamento para troca do produto
If (nPRODUT2 := aScan(aDadosCtr,{|x| x[1] ==
"AGW_PRODUT"})) > 0
aDadosCtr[nPRODUT2,2] :=
oGetDados:aCols[oGetDados:nAt,nPRODUT]
EndIf
Else
For nX := 1 To AGW->(FCount())
aAdd(aDadosCtr,{Trim(AGW->(FieldName(nX))),AGW-
>&(FieldName(nX))})
Next nX
EndIf

lConfirm := AT110Man("AGW",AGW->(Recno()),If(AGW-
>(Found()),4,3),aDadosCtr,cPlanil,oGetDados:aHeader,oGetDados:aCols)
Else
INCLUI := .T.
ALTERA := .F.

aAdd(aDadosCtr,{"AGW_CONTRA",cContra,.F.})
aAdd(aDadosCtr,{"AGW_PLANIL",cPlanil,.F.})
aAdd(aDadosCtr,
{"AGW_ITEM",oGetDados:aCols[oGetDados:nAt,nITEM],.F.})
aAdd(aDadosCtr,{"AGW_CLIENT",cCliente,.F.})
aAdd(aDadosCtr,{"AGW_LOJA",cLojaCli,.F.})
aAdd(aDadosCtr,
{"AGW_PRODUT",oGetDados:aCols[oGetDados:nAt,nPRODUT],.F.})
aAdd(aDadosCtr,{"AGW_DESCRI",Posicione("SB1",1,xFilial("SB1")
+oGetDados:aCols[oGetDados:nAt,nPRODUT],"B1_DESC"),.F.})

lConfirm :=
AT110Man("AGW",0,3,aDadosCtr,cPlanil,oGetDados:aHeader,oGetDados:aCols)
EndIf

//-- Valida chaves


While aPlani # NIL .And. lConfirm .And. !lValidou
lValidou := .T.

nPLANIL := aScan(aDadosCtr,{|x| x[1] == "AGW_PLANIL"})


nITEM2 := aScan(aDadosCtr,{|x| x[1] == "AGW_ITEM"})
nCLIENT := aScan(aDadosCtr,{|x| x[1] == "AGW_CLIENT"})
nLOJA := aScan(aDadosCtr,{|x| x[1] == "AGW_LOJA"})
nCODFAB := aScan(aDadosCtr,{|x| x[1] == "AGW_CODFAB"})
nLOJAFA := aScan(aDadosCtr,{|x| x[1] == "AGW_LOJAFA"})
nPRODUT2 := aScan(aDadosCtr,{|x| x[1] == "AGW_PRODUT"})
nNUMSER := aScan(aDadosCtr,{|x| x[1] == "AGW_NUMSER"})

For nX := 1 To Len(aPlani)
//-- Planilha sem localizacoes
If Empty(aTail(aPlani[nX]))
Loop
EndIf

For nY := 1 To Len(aTail(aPlani[nX]))
//-- Mesmo item da mesma planilha
If aTail(aPlani[nX])
[nY,2,nPLANIL,2]+aTail(aPlani[nX])[nY,2,nITEM2,2] ==
cPlanil+oGetDados:aCols[oGetDados:nAt,nITEM]
Loop
EndIf

If aTail(aPlani[nX])[nY,2,nCLIENT,2] ==
aDadosCtr[nCLIENT,2] .And.;
aTail(aPlani[nX])
[nY,2,nLOJA,2] == aDadosCtr[nLOJA,2] .And.;
aTail(aPlani[nX])
[nY,2,nPRODUT2,2] == aDadosCtr[nPRODUT2,2] .And.;
aTail(aPlani[nX])
[nY,2,nNUMSER,2] == aDadosCtr[nNUMSER,2]
Help(" ",1,"AT040INC01")
lValidou := .F.
EndIf
Next nY
Next nX

If !lValidou
lConfirm :=
AT110Man("AGW",0,If(lCntEdit,3,4),aDadosCtr,cPlanil,oGetDados:aHeader,oGetDados:aCo
ls)
EndIf
End

If lConfirm
If (nPosLocal := aScan(aLocais,{|x| x[1] ==
oGetDados:aCols[oGetDados:nAt,nITEM]})) == 0
aAdd(aLocais,
{oGetDados:aCols[oGetDados:nAt,nITEM],aClone(aDadosCtr)})
Else
aLocais[nPosLocal,2] := aClone(aDadosCtr)
EndIf
EndIf
EndIf
EndIf

INCLUI := lBkpINC
ALTERA := lBkpALT

Return

/*
������������������������������������������������
�����������������������������
������������������������������������������������
�����������������������������
������������������������������������������������
�������������������������ͻ��
���Programa � CNAGWLoad�Autor � Andre Anjos � Data � 18/08/11
���
������������������������������������������������
�������������������������͹͹ ��͹
���Descricao � Retorna array com as localizacoes fisicas (AGW). ���
������������������������������������������������
�������������������������͹͹ ��͹
���Uso � CNTA200 ���
������������������������������������������������
�������������������������ͼ��
������������������������������������������������
�����������������������������
������������������������������������������������
�����������������������������
*/
Function CNAGWLoad(nOpc,cContra,cPlanil)
Local aRet := {}
Local nX := 0

Default cContra := CNA->CNA_CONTRA


Default cPlanil := CNA->CNA_NUMERO

If AliasInDic("AGW") .And. nOpc # 3


AGW->(dbSetOrder(2))
AGW->(dbSeek(xFilial("AGW")+cContra+cPlanil))
While !AGW->(EOF()) .And. AGW->(AGW_FILIAL+AGW_CONTRA+AGW_PLANIL) ==
xFilial("AGW")+cContra+cPlanil
aAdd(aRet,{AGW->AGW_ITEM,Array(AGW->(FCount()))})
For nX := 1 To Len(aTail(aRet)[2])
aTail(aRet)[2,nX] := {AGW->(FieldName(nX)),AGW->&(FieldName(nX))}
Next nX

AGW->(dbSkip())
End
EndIf

Return aRet

/*
������������������������������������������������
�����������������������������
������������������������������������������������
�����������������������������
������������������������������������������������
�������������������������ͻ��
���Programa �CN200VlBas�Autor � Andre Anjos � Data � 29/08/11
���
������������������������������������������������
�������������������������͹͹ ��
͹
���Descricao � Valida alteracao do campo de integracao com Gestao de Serv.���
������������������������������������������������
�������������������������͹͹ ��
͹
���Uso � GCT ���
������������������������������������������������
�������������������������ͼ��
������������������������������������������������
�����������������������������
������������������������������������������������
�����������������������������
*/
Function CN200VlBas()
Local lRet := .T.
Local oObj := If(FunName() == "CNTA140",oGetDad1,oGetDados)

If M->CNB_BASINS == '1' .And. !Empty(oObj:aCols[oObj:nAt,aScan(oObj:aHeader, {|x|


AllTrim(x[2]) == "CNB_QTDMED"})])
Aviso(STR0059,STR0064,{"OK"}) //Este item n�o poder� gerar base instalada
pois j� foi movimentado.
lRet := .F.
ElseIf M->CNB_BASINS # '1' .And. !Empty(oObj:aCols[oObj:nAt,Len(oObj:aHeader)])
CNB->(dbGoTo(oObj:aCols[oObj:nAt,Len(oObj:aHeader)]))
If CNB->CNB_GERBIN == '1'
Aviso(STR0059,STR0065,{"OK"}) //Este item da planilha j� gerou base
instalada e por isso este campo n�o pode ser alterado.
lRet := .F.
EndIf
EndIf

Return lRet

/*
������������������������������������������������
�����������������������������
������������������������������������������������
�����������������������������
������������������������������������������������
�������������������������ͻ��
���Programa �C200BIWhen�Autor � Andre Anjos � Data � 29/08/11
���
������������������������������������������������
�������������������������͹͹ ��͹
���Descricao � When dos campos CNB_BASINS e CNB_TABPRC. ���
������������������������������������������������
�������������������������͹͹ ��͹
���Uso � GCT ���
������������������������������������������������
�������������������������ͼ��
������������������������������������������������
�����������������������������
������������������������������������������������
�����������������������������
*/
Function C200BIWhen(cCampo)
Local lRet := .T.

If cCampo == "CNB_BASINS"
lRet := SuperGetMV("MV_CNINTFS",.F.,.F.)
EndIf

If lRet
Do Case
Case FunName() $ "CNTA100*CNTA200"
lRet := !Empty(M->CNA_CLIENT)
Case FunName() == "CNTA140"
lRet := !Empty(CN9->CN9_CLIENT)
EndCase
EndIf

Return lRet

You might also like