Boa tarde caros amigos, Venho aqui postar um projeto pessoal, que acabei desenvolvendo ao longo deste tempo, e que graças a ajuda de alguns membros do fórum em fim consegui terminar. quem olha isto até acha que pode não ser tão útil, mas acabei desenvolvendo por que no meu caso me serviu e me caiu muito bem, obviamente pode ser melhorado mas não ando com muito tempo, então decidi postar aqui para que sirva de exemplo para outros e quem quiser a ajudar melhorar o código poste as ideias ou não. vou mostrar os passos que se deve fazer para gerar a planilha. 1 passo - rodar o arquivo .p 2 passo - digitar o nome da tabela do banco que deseja - OBS: O NOME TEM QUE SER IGUAL SE NÃO PODE DAR ERRO. 3 passo - digitar o caminho que deseja salvar o arquivo .xls 4 passo - se digitar 1 ( para escolher todos os campos da tabela) vá para o passo 5 OU digitar 2 ( para escolher a quantidade de colunas da tabela) faça o passo 4.1 e 4.2 4.1 passo - digite a quantidade de colunas que deseja. 4.2 passo - digite os nome das colunas que deseja, lembrando que os nomes devem existir na tabela do banco. 5 passo - escolha a imagem para incluir no cabeçalho. Só pode ser .bmp ou .pnj 6 - visualizar a tabela no Excel ( Isso é automático ) Segue o Código abaixo..... é grande...... OBS : Aceito dicas para melhora do código... Define Temp-table tt-campo No-undo Field campo As Character Format "X(255)". Define Temp-table tt-valor No-undo Field valor As Character Format "X(255)". def var x-app as com-handle no-undo. def var x-workbook as com-handle no-undo. def var x-worksheet as com-handle no-undo. def var x-c-tabela as char no-undo format "x(30)". /* nome da tabela do banco */ def var x-procname as char no-undo format "x(255)". /* guarda o caminho da img do cabeçalho*/ def var tb As Char No-undo. /* recebe o valor da x-c-tabela para o for each e o buffer */ def Var nc As Char no-undo extent 300 format "x(30)". /*guarda os nomes das colunas digitadas */ def var caminho as char no-undo format "x(40)". /* armazena o caminho onde salva o arquivo.*/ def var x-tmenu as int no-undo. /* qdt de menus*/ def var x-coluna as int no-undo init 1. /* coluna inicial */ def var x-linha as int no-undo init 1. /* linha inicial */ def var x-i as int no-undo. /* contador do repeat */ def var x-y as int no-undo. /* contador do repeat */ def var x-colunaF as int no-undo. /* coluna final */ def var x-linhaF as int no-undo. /* linha final */ def var ix As int No-undo. /*contador para repeat*/ def var iy as int no-undo. /*contador para repeat*/ def var iz as int no-undo. /*contador para repeat*/ def var cc as int no-undo. /*contador para a tt-valor no for each*/ def var escol as int no-undo. /* para escolher se quer todas as colunas ou nao */ def var contCol as int no-undo. /* controla coluna */ def var contLin as int no-undo. /* controla linha */ def var contIx as int no-undo. /* contrala o ix */ def var OKpressed as log init false. /* variavel que controla a selecao da img */ def var l-qdtcol as log init false. /* flag para colunas da tabela */ Define Variable qh As Handle No-undo. /* variavel para query */ Define Variable bh As Handle No-undo. /* variavel do buffer */ Define Variable fh As Handle No-undo Extent 300. /* variavel para os campos do buffer */ /*variavel para colunas do excel */ DEF VAR vc-letras AS CHAR FORMAT "X(2)" EXTENT 260 INITIAL ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL", "CM", "CN", "CO", "CP", "CQ", "CR", "CS", "CT", "CU", "CV", "CW", "CX", "CY", "CZ", "DA", "DB", "DC", "DD", "DE", "DF", "DG", "DH", "DI", "DJ", "DK", "DL", "DM", "DN", "DO", "DP", "DQ", "DR", "DS", "DT", "DU", "DV", "DW", "DX", "DY", "DZ", "EA", "EB", "EC", "ED", "EE", "EF", "EG", "EH", "EI", "EJ", "EK", "EL", "EM", "EN", "EO", "EP", "EQ", "ER", "ES", "ET", "EU", "EV", "EW", "EX", "EY", "EZ", "FA", "FB", "FC", "FD", "FE", "FF", "FG", "FH", "FI", "FJ", "FK", "FL", "FM", "FN", "FO", "FP", "FQ", "FR", "FS", "FT", "FU", "FV", "FW", "FX", "FY", "FZ", "GA", "GB", "GC", "GD", "GE", "GF", "GG", "GH", "GI", "GJ", "GK", "GL", "GM", "GN", "GO", "GP", "GQ", "GR", "GS", "GT", "GU", "GV", "GW", "GX", "GY", "GZ", "HA", "HB", "HC", "HD", "HE", "HF", "HG", "HH", "HI", "HJ", "HK", "HL", "HM", "HN", "HO", "HP", "HQ", "HR", "HS", "HT", "HU", "HV", "HW", "HX", "HY", "HZ", "IA", "IB", "IC", "ID", "IE", "IF", "IG", "IH", "II", "IJ", "IK", "IL", "IM", "IN", "IO", "IP", "IQ", "IR", "IS", "IT", "IU", "IV" ] NO-UNDO. /*cria a aplicação*/ create "Excel.Application" x-app. /*deixa invisivel o excel*/ x-app:visible = false. /*adiciona uma planilha*/ x-workbook = x-app:workbooks:add(). /*seleciona a planilha*/ x-worksheet = x-app:Sheets:item(1). /* retira as linhas e deixa tudo em branco*/ x-app:ActiveWindowisplayGridlines = False. /*modifica o nome da planilha*/. x-worksheet:name = "Planilha Teste". /* atualiza a tabela a ser usada, e a quantidade de menu */ message "Digite o nome da tabela do banco" update x-c-tabela. message "Digite o caminho onde deseja salvar o arquivo" update caminho. MESSAGE " Digite 1 para todas as colunas da tabela ou" skip " Digite 2 para escolher a qdt de colunas" update escol. if escol = 1 then do: l-qdtcol = true. end. else do: message "Digite a quantidade de colunas" update x-tmenu. if x-tmenu <= 2 then do: MESSAGE "a quantidade de colunas tem que ser maior que 2" VIEW-AS ALERT-BOX INFO BUTTONS OK. return no-apply. end. l-qdtcol = false. end. Assign tb = x-c-tabela. Create Buffer bh For Table tb. Create Query qh. qh:Set-buffers(bh). qh:Query-prepare("For Each " + tb). qh:Query-open(). qh:Get-first(). if l-qdtcol = false then do: repeat iy = 1 to x-tmenu: message "Coluna" iy update nc[iy]. end. end. Repeat: IF qh:Query-off-end Then Leave. Assign ix = 0. Repeat ix = 1 TO bh:Num-fields: fh[ix] = bh:Buffer-field(ix). if l-qdtcol = false then do: repeat iz = 1 to x-tmenu: if nc[iz] = fh[ix]:name then do: find first tt-campo where tt-campo.campo = fh[ix]:name no-lock no-error. if not avail tt-campo then do: create tt-campo. Assign tt-campo.campo = fh[ix]:name. end. Create tt-valor. Assign tt-valor.valor = String(fh[ix]:Buffer-value). end. end. end. else do: find first tt-campo where tt-campo.campo = fh[ix]:name no-lock no-error. if not avail tt-campo then do: create tt-campo. Assign tt-campo.campo = fh[ix]:name. end. Create tt-valor. Assign tt-valor.valor = String(fh[ix]:Buffer-value). end. contIx = ix. end. qh:Get-next. End. qh:Query-close(). bh:Buffer-release(). Delete Object bh. Delete Object qh. assign contcol = 1 contLin = 1 x-coluna = 1. for each tt-campo no-lock. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha)):value = tt-campo.campo. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha)):Borders(2):LineStyle = 1. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha) + ":" + vc-letras[if l-qdtCol = false then x-tmenu else contIx] + string(x-linha)):HorizontalAlignment = -4108. assign x-coluna = x-coluna + 1. contCol = contCol + x-coluna. if contCol > 260 then do: MESSAGE "Excedeu o nuemro de colunas" VIEW-AS ALERT-BOX INFO BUTTONS OK. leave. release object x-app. release object x-workbook. release object x-worksheet. end. end. assign x-coluna = 1 x-linha = x-linha + 1. for each tt-valor no-lock. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha)):value = tt-valor.valor. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha)):Borders(2):LineStyle = 1. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha)):Borders(3):LineStyle = 1. x-app:Sheets(1):Range(vc-letras[x-coluna] + string(x-linha)):Borders(4):LineStyle = 1. x-coluna = x-coluna + 1. cc = cc + 1. if cc >= (if l-qdtcol = false then x-tmenu else contIx) then do: assign x-coluna = 1 x-linha = x-linha + 1 cc = 0 contLin = contLin + x-linha. end. if contLin > 65000 then do: MESSAGE "Excedeu o numero de linhas" VIEW-AS ALERT-BOX INFO BUTTONS OK. leave. release object x-app. release object x-workbook. release object x-worksheet. end. end. assign x-coluna = 1. /*recebe linha e coluna final para preencher as bordas*/ assign x-colunaF = if l-qdtcol = false then x-tmenu else contIx. x-linhaF = x-linha. SYSTEM-DIALOG GET-FILE x-procname TITLE "Escolha um imagem para o cabeçalho...." FILTERS "(*.bmp)" "*.bmp", "(*.jpeg)" "*.jpeg", "(*.gif)" "*.gif" MUST-EXIST USE-FILENAME UPDATE OKpressed. IF OKpressed = TRUE THEN do: run cabecalho(input 1). end. else do: MESSAGE "PF Selecionar um imagem" VIEW-AS ALERT-BOX INFO BUTTONS OK. leave. end. x-app:Columns(vc-letras[x-coluna] + ":" + vc-letras[x-colunaF]):EntireColumn:AutoFit. /*Função para salvar no caminho escolhido */ x-app:ActiveWorkBook:SaveAs(caminho + x-c-tabela + string(time) + ".xls",-4143,"","",false,false,3). /*abre o excel*/ x-app:Visible = TRUE. /*finaliza a aplicação*/ release object x-app. release object x-workbook. release object x-worksheet. procedure cabecalho. /* começa a inserção do cabeçalho do programa */ def var x-colc as int. def var x-larg as dec. def var x-ultc as char. def input param p1 as int. x-app:Sheets:item(p1):select(). x-ultc = vc-letras[x-colunaF]. x-app:Sheets(p1):Rows(1):insert(). x-app:Sheets(p1):Rows(1):insert(). x-app:Sheets(p1):Rows(1):insert(). x-app:Sheets(p1):Rows(1):insert(). x-app:Sheets(p1):Rows(1):insert(). x-app:Sheets(p1):Rows(1):insert(). x-app:Sheets(p1):Range("A1"):value = " ". x-app:Sheets(p1):Range("A1:" + x-ultc + "1"):Merge(). x-app:Sheets(p1):Range("A1:" + x-ultc + "1"):font:size = 10. x-app:Sheets(p1):Range("A2"):value = "". x-app:Sheets(p1):Range("A2:" + x-ultc + "2"):Merge(). x-app:Sheets(p1):Range("A2:" + x-ultc + "2"):font:size = 8. x-app:Sheets(p1):Range("A3"):value = "". x-app:Sheets(p1):Range("A3:" + x-ultc + "3"):Merge(). x-app:Sheets(p1):Range("A4"):value = "Relatório Teste". x-app:Sheets(p1):Range("A4:" + x-ultc + "4"):Merge(). x-app:Sheets(p1):Range("A4:" + x-ultc + "4"):font:size = 14. x-app:Sheets(p1):Range("A4:" + x-ultc + "4"):HorizontalAlignment = -4108. x-app:Sheets(p1):Range("A5"):value = string(today,"99/99/9999") + " " + string(time,"hh:mm"). x-app:Sheets(p1):Range("A5:" + x-ultc + "5"):Merge(). x-app:Sheets(p1):Range("A5:" + x-ultc + "5"):HorizontalAlignment = -4108. x-app:Sheets(p1):Range(x-app:Sheets(p1):Cells(1,1),x-app:Sheets(p1):Cells(1,x-colunaF)):Borders(3):LineStyle = 1. x-app:Sheets(p1):Range(x-app:Sheets(p1):Cells(6,1),x-app:Sheets(p1):Cells(6,x-colunaF)):Borders(4):LineStyle = 1. x-app:Sheets(p1):Range(x-app:Sheets(p1):Cells(1,1),x-app:Sheets(p1):Cells(6,1)):Borders(1):LineStyle = 1. x-app:Sheets(p1):Range(x-app:Sheets(p1):Cells(1,x-colunaF),x-app:Sheets(p1):Cells(6,x-colunaF)):Borders(2):LineStyle = 1. x-app:Sheets(p1):Range(x-app:Sheets(p1):Cells(4,1),x-app:Sheets(p1):Cells(4,x-colunaF)):Borders(3):LineStyle = 1. x-app:Sheets(p1):Range(x-app:Sheets(p1):Cells(5,1),x-app:Sheets(p1):Cells(5,x-colunaF)):Borders(4):LineStyle = 1. x-app:Sheets(p1)ictures:insert(search(x-procname)):select(). x-app:Sheets(p1)ictures:ShapeRange:left = x-app:columns(x-colunaF):left - (x-app:Sheets(p1)ictures:width * 0.375). x-app:Sheets(p1)ictures:ShapeRange:top = 1. x-app:Sheets(p1)ictures:ShapeRange:ScaleWidth(0.60,false,0). x-app:Sheets(p1)ictures:ShapeRange:ScaleHeight(0.60,false,0). x-app:Sheets(p1)ictures:ShapeRangeictureFormat:TransparentBackground = TRUE. x-app:Sheets(p1)ictures:ShapeRangeictureFormat:TransparencyColor = RGB-VALUE(255,255,255). x-app:Sheets(p1)ictures:ShapeRange:Fill:Visible = FALSE. /*friza o painel apos o menu*/ x-app:Sheets(1):Range(vc-letras[x-coluna] + string(8)):select(). x-app:ActiveWindow:FreezePanes = true. end procedure.