Static Function MontaAcols()
Local aAux := {}
Local cSQL := ""
Local nFor := 0
Local nSaldoIni := 0
Local nTotalEnt := 0
Local nTotalSai := 0
// Comentado pois estava gerando erro, não pode usar declare nas query quando são executadas dentro do ADVPL
/*cSQL += "DECLARE @DT_INI VARCHAR(08) "
cSQL += "DECLARE @DT_FIM VARCHAR(08) "
cSQL += "DECLARE @PROD VARCHAR(15) "
cSQL += "SET @DT_INI = '" + dDtDe + "' "
cSQL += "SET @DT_FIM = '" + dDtAte + "' "
cSQL += "SET @PROD = '" + cCodProd + "' "*/
cSQL += "SELECT "
cSQL += " SD2.D2_FILIAL, SD2.D2_EMISSAO, SD2.D2_DOC, SD2.D2_CF, SF2.F2_XNCLI, 0 ENTRADA, SUM(SD2.D2_QUANT) SAIDA, '' SALDO, SD2.D2_LOTECTL, SD2.D2_DTVALID, C5_X_TPOPE "
cSQL += "FROM " + RetSQLName("SD2") + " SD2 "
cSQL += "JOIN " + RetSQLName("SF2") + " SF2 ON SD2.D2_DOC = SF2.F2_DOC AND SD2.D2_FILIAL = SF2.F2_FILIAL AND SF2.D_E_L_E_T_ = ' ' "
cSQL += "JOIN " + RetSQLName("SC5") + " SC5 ON SD2.D2_PEDIDO = SC5.C5_NUM AND SD2.D2_FILIAL = SC5.C5_FILIAL AND SC5.D_E_L_E_T_ = ' ' AND SC5.C5_X_TPOPE NOT IN ('08','14','16','F') "
cSQL += "WHERE SD2.D_E_L_E_T_ = ' ' "
cSQL += "AND SD2.D2_EMISSAO BETWEEN CONVERT(DATE,'" + dDtDe + "',103) AND CONVERT(DATE,'" + dtoc(dDataBase) + "',103) "
cSQL += "AND SD2.D2_COD = '" + cCodProd + "'"
cSQL += "GROUP BY "
cSQL += " SD2.D2_FILIAL, SD2.D2_EMISSAO, SD2.D2_DOC, SD2.D2_CF, SF2.F2_XNCLI, SD2.D2_LOTECTL, SD2.D2_DTVALID, C5_X_TPOPE "
cSQL += "UNION "
cSQL += "SELECT "
cSQL += " (CASE WHEN(SZ7.Z7_SERIE != '2') "
cSQL += " THEN('0101') "
cSQL += " ELSE('0102') "
cSQL += " END) FILIAL, SZ7.Z7_EMISSAO, SZ7.Z7_DOC, REPLACE(SZ7.Z7_CFOP, '.', '') CFOP, SZ6.Z6_NOME, "
cSQL += " (CASE WHEN(SZ6.Z6_ESTOQUE = 'E') "
cSQL += " THEN(SZ7.Z7_QUANT) "
cSQL += " ELSE(0) "
cSQL += " END) ENTRADA, "
cSQL += " (CASE WHEN(SZ6.Z6_ESTOQUE = 'S') "
cSQL += " THEN(SZ7.Z7_QUANT) "
cSQL += " ELSE(0) "
cSQL += " END) SAIDA, '' SALDO, '' LOTE, '' VALIDADE, '' C5_X_TPOPE "
cSQL += "FROM " + RetSQLName("SZ7") + " SZ7 "
cSQL += "JOIN " + RetSQLName("SZ6") + " SZ6 ON SZ7.Z7_DOC = SZ6.Z6_DOC AND SZ7.Z7_SERIE = SZ6.Z6_SERIE AND SZ7.Z7_ESTOQUE != 'N' AND SZ6.D_E_L_E_T_ = ' ' "
cSQL += "WHERE SZ7.D_E_L_E_T_ = ' ' AND SZ6.Z6_ESTOQUE != 'N' "
cSQL += "AND SZ7.Z7_EMISSAO BETWEEN CONVERT(DATE,'" + dDtDe + "',103) AND CONVERT(DATE,'" + dtoc(dDataBase) + "',103) "
cSQL += "AND SZ7.Z7_COD = '" + cCodProd + "'"
cSQL += "UNION "
cSQL += "SELECT "
cSQL += " SD1.D1_FILIAL, SD1.D1_DTDIGIT, SD1.D1_DOC, SD1.D1_CF, SA2.A2_NOME, SUM(SD1.D1_QUANT) D1_QUANT, 0, '' SALDO, SD1.D1_LOTECTL, SD1.D1_DTVALID, '' C5_X_TPOPE "
cSQL += "FROM " + RetSQLName("SD1") + " SD1 "
cSQL += "JOIN " + RetSQLName("SF1") + " SF1 ON SD1.D1_DOC = SF1.F1_DOC AND SD1.D1_FILIAL = SF1.F1_FILIAL AND SF1.F1_FORNECE = SD1.D1_FORNECE AND SF1.F1_LOJA = D1_LOJA AND SF1.D_E_L_E_T_ = ' ' "
cSQL += "JOIN " + RetSQLName("SA2") + " SA2 ON SD1.D1_FORNECE = SA2.A2_COD AND SD1.D1_LOJA = SA2.A2_LOJA AND SA2.D_E_L_E_T_ = ' ' "
cSQL += "JOIN SF4010 SF4 ON SF4.F4_CODIGO = D1_TES AND F4_ESTOQUE != 'N' AND SF4.D_E_L_E_T_ = '' "
cSQL += "WHERE SD1.D_E_L_E_T_ = ' ' AND SD1.D1_CF NOT IN ('1152','1409','1923','2923','1922','2922')"//ele tira do relatorio esses dados
// A INLCUIR : PARA CONSIDERAR AS ENTRADAS NO PERIODO E QUE A VALIDADE DO PRODUTO, SE INOFRMADA, SEJA MENOR OU IGUAL A VALIDADE DA PROMOCAO
cSQL += "AND SD1.D1_DTDIGIT BETWEEN CONVERT(DATE,'" + dDtDe + "',103) AND CONVERT(DATE,'" + dtoc(dDataBase) + "',103) "
cSQL += "AND SD1.D1_COD = '" + cCodProd + "' AND D1_TIPO <> 'D'"
cSQL += "GROUP BY "
cSQL += " SD1.D1_FILIAL, SD1.D1_DTDIGIT, SD1.D1_DOC, SD1.D1_CF, SA2.A2_NOME, SD1.D1_LOTECTL, SD1.D1_DTVALID "
cSQL += "UNION "
cSQL += "SELECT "
cSQL += " (CASE WHEN(SZ9.Z9_SERIE != '2') "
cSQL += " THEN('0101') "
cSQL += " ELSE('0102') "
cSQL += " END) FILIAL, SZ9.Z9_DTENTRA, SZ9.Z9_DOC, REPLACE(SZ9.Z9_CFOP, '.', '') CFOP, SZ8.Z8_NOME, "
cSQL += " (CASE WHEN(SZ9.Z9_ESTOQUE = 'E') "
cSQL += " THEN(SZ9.Z9_QUANT) "
cSQL += " ELSE(0) "
cSQL += " END) ENTRADA, "
cSQL += " (CASE WHEN(SZ9.Z9_ESTOQUE = 'S') "
cSQL += " THEN(SZ9.Z9_QUANT) "
cSQL += " ELSE(0) "
cSQL += " END) SAIDA, ' ' SALDO, ' ' LOTE, '' VALIDADE, '' C5_X_TPOPE "
cSQL += "FROM " + RetSQLName("SZ9") + " SZ9 "
cSQL += "JOIN " + RetSQLName("SZ8") + " SZ8 ON SZ9.Z9_DOC = SZ8.Z8_DOC AND SZ9.Z9_SERIE = SZ8.Z8_SERIE AND SZ8.Z8_ESTOQUE != 'N' AND SZ8.D_E_L_E_T_ = ' ' "
cSQL += "WHERE SZ9.D_E_L_E_T_ = ' ' AND SZ9.Z9_ESTOQUE != 'N' "
cSQL += "AND SZ9.Z9_DTENTRA BETWEEN CONVERT(DATE,'" + dDtDe + "',103) AND CONVERT(DATE,'" + dtoc(dDataBase) + "',103) "
cSQL += "AND SZ9.Z9_CODBARR = '" + cCodProd + "'"
cSQL += " UNION"
cSQL += " select"
cSQL += " D3_FILIAL,"
cSQL += " D3_EMISSAO,"
cSQL += " (CASE WHEN (D3_DOC = '') "
cSQL += " THEN (D3_DOC2) "
cSQL += " ELSE (D3_DOC) "
cSQL += " END) AS D2_DOC,"
cSQL += " D3_TM,"
cSQL += " (CASE WHEN (D3_TM <= '500') "
cSQL += " THEN ("
cSQL += " (select TOP 1"
cSQL += " 'Tranferencia Armazem ' + SAIDA.D3_LOCAL"
cSQL += " from SD3010 SAIDA"
cSQL += " where SAIDA.D3_COD = SD3010.D3_COD AND SAIDA.D3_NUMSEQ = SD3010.D3_NUMSEQ AND SAIDA.D3_TM > '500' AND SAIDA.D_E_L_E_T_ = ''"
cSQL += " ) + ' -> ' + D3_LOCAL) "
cSQL += " ELSE ("
cSQL += " (select TOP 1"
cSQL += " 'Tranferencia Armazem ' + SAIDA.D3_LOCAL"
cSQL += " from SD3010 SAIDA"
cSQL += " where SAIDA.D3_COD = SD3010.D3_COD AND SAIDA.D3_NUMSEQ = SD3010.D3_NUMSEQ AND SAIDA.D3_TM <= '500' AND SAIDA.D_E_L_E_T_ = ''"
cSQL += " ) + ' -> ' + D3_LOCAL) "
cSQL += " END) AS DESCRICAO, "
cSQL += " (CASE WHEN (D3_TM > '500') "
cSQL += " THEN (D3_QUANT) "
cSQL += " ELSE (0) "
cSQL += " END) AS ENTRADA,"
cSQL += " (CASE WHEN (D3_TM <= '500') "
cSQL += " THEN (D3_QUANT) "
cSQL += " ELSE (0) "
cSQL += " END) AS SAIDA,"
cSQL += " '' SALDO,"
cSQL += " D3_LOTECTL,"
cSQL += " D3_DTVALID, '' C5_X_TPOPE"
cSQL += " from SD3010"
cSQL += " where D3_COD = '" + cCodProd + "' and SD3010.D_E_L_E_T_ = ''"
cSQL += " and D3_EMISSAO BETWEEN CONVERT(DATE,'" + dDtDe + "',103) AND CONVERT(DATE,'" + dtoc(dDataBase) + "',103)"
cSQL += " and D3_LOCAL IN ('03','04','53','54')"
cSQL += " AND D3_ESTORNO != 'S' AND "
cSQL += " (CASE"
cSQL += " WHEN (D3_TM > '500') "
cSQL += " THEN (select SAI2.D3_LOCAL from SD3010 SAI2 where SAI2.D3_COD = SD3010.D3_COD AND SAI2.D3_NUMSEQ = SD3010.D3_NUMSEQ"
cSQL += " AND SAI2.D3_TM <= '500') "
cSQL += " ELSE ("
cSQL += " select ENT2.D3_LOCAL from SD3010 ENT2 where ENT2.D3_COD = SD3010.D3_COD AND ENT2.D3_NUMSEQ = SD3010.D3_NUMSEQ"
cSQL += " AND ENT2.D3_TM > '500') END) NOT IN ('07','57')"
cSQL += " UNION"
cSQL += " SELECT "
cSQL += " SD1.D1_FILIAL, "
cSQL += " SD1.D1_DTDIGIT,"
cSQL += " SD1.D1_DOC,"
cSQL += " SD1.D1_CF, "
cSQL += " SA1.A1_NOME,"
cSQL += " SUM(SD1.D1_QUANT) D1_QUANT,"
cSQL += " 0 SAIDA, "
cSQL += " '' SALDO, "
cSQL += " SD1.D1_LOTECTL, "
cSQL += " SD1.D1_DTVALID,"
cSQL += " C5_X_TPOPE"
cSQL += " FROM SD1010 SD1"
cSQL += " JOIN SC5010 SC5 ON D1_NFORI = C5_NOTA AND D1_FILORI = C5_FILIAL AND SC5.D_E_L_E_T_=' '"
cSQL += " JOIN SF1010 SF1 ON SD1.D1_DOC = SF1.F1_DOC AND SD1.D1_FILIAL = SF1.F1_FILIAL AND SF1.F1_FORNECE = SD1.D1_FORNECE AND SF1.F1_LOJA = D1_LOJA AND SF1.D_E_L_E_T_ = ' ' "
cSQL += " JOIN SA1010 SA1 ON SD1.D1_FORNECE = SA1.A1_COD AND SD1.D1_LOJA = SA1.A1_LOJA AND SA1.D_E_L_E_T_ = ' ' "
cSQL += " WHERE SD1.D_E_L_E_T_ = ' ' AND SD1.D1_DTDIGIT BETWEEN CONVERT(DATE,'" + dDtDe + "',103) AND CONVERT(date,'" + dtoc(dDataBase) + "',103) AND D1_TIPO = 'D' AND F1_TIPO = 'D' AND SD1.D1_COD = '" + cCodProd + "'"
cSQL += " GROUP BY SD1.D1_FILIAL, SD1.D1_DTDIGIT, SD1.D1_DOC, SD1.D1_CF, SA1.A1_NOME, SD1.D1_LOTECTL, SD1.D1_DTVALID, C5_X_TPOPE "
cSQL += "ORDER BY "
cSQL += " D2_EMISSAO "
TCQUERY cSQL NEW ALIAS "QRYSD1"
DbSelectArea("QRYSD1")
While QRYSD1->(!EOF()) // array auxiliar para guardar o retorno da Query
if STOD(QRYSD1->D2_EMISSAO) <= STOD(dDtAte)
aAdd(aAux, { QRYSD1->D2_FILIAL, STOD(QRYSD1->D2_EMISSAO), QRYSD1->D2_DOC, QRYSD1->D2_CF, QRYSD1->F2_XNCLI;
,QRYSD1->ENTRADA , QRYSD1->SAIDA , QRYSD1->SALDO , STOD(QRYSD1->D2_DTVALID), QRYSD1->D2_LOTECTL, QRYSD1->C5_X_TPOPE})
nSaldoIni -= QRYSD1->ENTRADA // Variavel auxliar para calculo do Saldo inicial do extrado
nSaldoIni += QRYSD1->SAIDA // Entrada subtrai e saida soma, depois soma com o estoque atual do produto para se obter o saldo inical
EndIF
QRYSD1->(DbSkip())
EndDo
QRYSD1->(DbCloseArea())
nSaldoIni += nEst
// Adiciona primeira linha da grid, contendo o saldo inicial do produto
aAdd(aCols, {'', STOD(dDtDe), '', '', '', 'SALDO INICIAL', 0, 0, nSaldoIni, '', '', .F.})
For nFor := 1 To Len(aAux)
If DTOS(aAux[nFor][02]) <= dDtAte
nSaldoIni := nSaldoIni - aAux[nFor][07] + aAux[nFor][06]
nTotalEnt += aAux[nFor][06] // Varivael apra armazenar total de entrada
nTotalSai += aAux[nFor][07] // Varivael apra armazenar total de saida
aAdd(aCols, {aAux[nFor][01], aAux[nFor][02], aAux[nFor][03], aAux[nFor][04], aAux[nFor][11], aAux[nFor][05], aAux[nFor][06], aAux[nFor][07], nSaldoIni, aAux[nFor][09], aAux[nFor][10], .F.})
EndIf
Next nFor
// Adiciona última linha do Grid contendo os totais
aAdd(aCols,{'', STOD(dDtAte), '', '', '', 'TOTAIS', nTotalEnt, nTotalSai, nSaldoIni, '', '', .F.})
Return
tenho um relatório de movimentação de produtos, mas quero que nas movimentações D3_LOCAL 01, 51 não sejam contabilizadas as voltas para não alterar o valor.