
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
é, este que eu citei, eu fiquei meio confuso, por isso perguntei se serviria ou não. Na página ele começa citando que é compatível com 2.2/2.3 e logo mais abaixo cita apenas 2.3 :wacko: era isso que eu temia. Queimamos pestanas à toa. :( Abraços
-
acho que o colega Adir Kuhn poderia utilizar o utilitário de linha de comando mysqldump que costuma ser usado para backup. Se digitar no prompt mysqldump -? dá para ver todas as opções que ele fonece. Uma linha como esta, extrai basicamente tudo do banco (creates e inserts): mysqldump --no-defaults --all-databases --compatible=ansi --triggers -R -u <nome_banco> -p > DBExported.sql seria conveniente verificar o resultado utilizando as configurações default do MySQL, dái a linha fica só assim (achei que apareceu coisa demais no script, por isso desabilitei o defaul): mysqldump --all-databases --compatible=ansi -u <nome_banco> -p > DBExported.sql Só não descobri como gerar os INSERTs separados, ele gera um INSERT INTO gigante... Mas, se for compatível... na pior das hipóteses, daria para exportar apenas o metadata, evitando os INSERTs com a diretiva --insert-ignore e depois exportando os dados por outro método. Ainda teria que ver como que esse COPY espera receber os dados - se o arquivo exportado é lido direto. Abraços
-
flavio, pelo que entedi sobre esse negócio de MODs e BBCode, eles não são exatamente a mesma coisa não. Digamos que o BB Code é a marcação (o uso das tags) no texto que serão passados pelos MOD (modificadores - codificação que implementa a substituição destas tags) que farão a triagem do texto "editado" para retornar a página formatada como vemos nos nossos navegadores. (me corrijam aí se entendi errado - estou tentando aprender mais sobre o assunto) Já tem um tempinho, andava fuçando por aí procurando saber se teria algum MOD para Delphi. (Eu arriscaria pedir ao Admin para instalá-lo, se possível. :D) Cá entre nós, este MOD do SQL é bem "meia boca" - colore até palavras reservadas que, na verdade, fazem parte de um identificador. No forum DaniWeb (baseado no vBulletin) o código delphi fica com uma formatação bem feita: Post Delphi KaKarotto, você ia gostar de ter MODs como os de PHP e HTML do vBulletin - tem o efeito sintax highlight perfeitos.(BB Code List, próx do fim da pg) E Graymalkin, este CodeBox para PHP (PZ23-PHP Codebox v1.0), também serviria aqui pro forum? Abraços
-
eu não sei muita coisa sobre eles não, mas basicamente reside em a versão Enterprise ser a mais completa, dando suporte a mais bancos de dados (drivers/tecnologia), e recursos de WEB service.Mas, dependendo do que você pretende desenvolver, isto pode ser pouco relevante, principalmente no que diz respeito a acesso à banco de dados - caso você trabalhe com os free. Há componentes de terceiros como o pacote Zeos (MySQL, PostgreSQL, Interbase, Firebird, MS SQL, Sybase, Oracle and SQLite). Dê uma olhada neste post (ref. DevMedia), citam mais algumas coisas. Caso, mais ninguém venha a contribuir para minimizar esta sua dúvida, penso que talvez você pudesse fazer este questionamento no forum ActiveDelphi - a galera que escreve os artigos para a revista normalmente postam lá também. Abraços
-
(Resolvido) Problema com instrução insert com Delphi+Access+ADO
pergunta respondeu ao Flávio Borges de Micheus em Delphi, Kylix
Flávio Borges, o erro está no fato de você ter utilizado as aspas próximo aos parâmetros. Na verdade o parâmetro faz parte da string: '...) values(:DescSubeenero, :CodGenero)'; Outra coisa, prefira não utilizar Value ao passar o parâmetro. Assim como fez com o primeiro parâmetro, indique o tipo de dados a ser passado via os métodos AsString, AsInteger, As... Abraços -
serginho_pv, a contatenação das variáveis $diainicio e $diafim diretamente neste formato gerarão algo como: SELECT * FROM ABASTECIMENTO WHERE dia_abastecimento BETWEEN 2007-01-01 AND 2007-02-28 ORDER BY cod_placa, dia_abastecimento o que claramente irá gerar um erro na execução da consulta. O MSAccess usa como delimitador de data o caracter "#". Assim, você terá que ajustar sua string para acomodá-lo desta forma: SELECT * FROM ABASTECIMENTO WHERE dia_abastecimento BETWEEN #'$diainicio'# AND #'$diafim'# ORDER BY cod_placa, dia_abastecimento agora sua string de consulta gerará algo como: SELECT * FROM ABASTECIMENTO WHERE dia_abastecimento BETWEEN #2007-01-01# AND #2007-02-28# ORDER BY cod_placa, dia_abastecimento O formato ideal é este mesmo yyyy-mm-dd (ou com as barras, mas nesta seqüência) Abraços
-
Tem um site bem interessante chamado Programmers Heaven. Lá existe estes dois códigos para trabalhar com audio compatível com placas Sound Blaster. Talvez sirvam de de referência. - Sound Blaster Mixer Control Library (C/pascal); - SOUNDHAX v1 ou Soundblaster sourcecode (C/C++) é só ir procurando que talvez achem algo que sirva. Abraços
-
(Resolvido) Relatório usando duas tabelas filhas sem usar tabela
pergunta respondeu ao Tatiane.InterArt de Micheus em Delphi, Kylix
Talvez eu é quem tenha sido simplista demais. Então, resolvi fazer este "pequeno" tutorial para o seu relatório (mas servirá a outros, tenho certeza) - por favor não desista de lê-lo. :( não tem tantas cabeças assim, não. Se você ler direitinho do início ao fim, depois de pronto, você vai ver que é simples. :D Bom, vamos lá 1) Então, vamos ver se entendemos as consultas... a - Consulta que retornas os dados que determinarão a seqüência em que o relatório será apresentado, ou seja, ordenado por DataVencmto e viabilizando o agrupamento por esta data (IBQuery1): SELECT CodPg, DataVencmto, Valor FROM FormaPagto WHERE DataVencimento between :DtInicio and :DtTermino ORDER BY DataVencmto, CodPg b - Consulta que tem por objetivo buscar, na tabela mestre (ContasPagar), o nome do cliente a ser apresentado no relatório (IBQuery2). Aproveitaremos para buscar, nesta consulta, o nome do cliente: SELECT C.NomCli FROM ContasPagar CP, Cliente C WHERE CP.CodPg = :CodPg AND CP.CodCli = C.CodCli c - Consulta que tem por objetivo retornar todos os itens relacionados com a tabela mestre (ContasPagar), porém através de FormaPagto via campo comum CodPg (IBQuery3): SELECT Descricao, Qtde FROM ItemContPg WHERE CodPg = :CodPg Obs: buscamos nos SELECTs apenas os campos de que necessitamos. 2) Preparando os componentes de consulta... Como já havia mencionado, as consultas parametrizadas (detalhes) deverão estar vinculadas à consulta principal (mestre). Isto, porque queremos que para cada registro do dataset mestre, impresso, os datasets detalhes sejam atualizados. Para as consultas utilizadas neste projeto, a parametrização funcionará sem problemas não sendo necessário a criação em run-time das strings de consultas SQL. Assim, podemos adicionar estas queries diretamente na propriedade SQL dos datasets IBQuery<n> - isto eliminará linhas de seu código e viabilizará a adição dos campos (Fields) aos datasets (o que parece-me você já o fez). Na seqüência, para cada dataset que fizemos uso da parametrização, acesse a propriedade Params, selecione cada parâmetro na lista e ajuste as propriedades: DataType e ParamType de acordo com o que representam. Por ex., para IBQuery2 no parâmetro CodPg você define DataType = ftInteger e ParamType = ptInput. A próxima etapa é definir nos datasets detalhes, de onde virão os parâmetros para o filtro – sabemos que deverá ser do dataset mestre. Para tanto, selecionamos na propriedade DataSource (origem de dados) dos datasets clientes (IBQuery2 e IBQuery3) o componente DataSource (DataSource1) associado ao dataset mestre (IBQuery1). Como isto funcionará: quando as consultas dos datasets filhos forem executadas pelos respectivos componentes, os parâmetros deverão conter um valor. Este valor pode ser informado manualmente (o comum) ou serem obtidos de outro dataset via propriedade DataSource (nosso caso) e este é o motivo pelo qual é importante que o nome do parâmetro seja exatamente o mesmo nome do campo, no dataset origem, que desejamos fazer a referência. O melhor, disto tudo, é que ele é controlado sozinho (nada de ficar fechando e abrindo a consulta a cada novo valor). 3) Alterações no código para manipulação das consultas... - Levando em conta o que já citei no item anterior, e por questão de organização, vou lhe sugerir criar um procedimento no seu form FrmImpRelContPag para que nos facilite algumas coisas. Este procedimento chamarei ShowPreview. Assim, na unit onde está declarado o seu form faremos as seguintes alterações: unit ... Type TfrmImpRelContPag = class(TForm) ... public procedure ShowPreview(DtReferencia: TDateTime; QtdDias :Integer); end; ... implementation ... procedure TfrmImpRelContPag.ShowPreview(DtReferencia: TDateTime; QtdDias :Integer); begin // inicializamos o filtro do período a ser avaliado IBQuery1.ParamByName(‘DtInicio’).AsDateTime := DtReferencia; IBQuery1.ParamByName(‘DtTermino’).AsDateTime := DtReferencia +QtdDias; IBQuery1.Open; IBQuery2.Open; IBQuery3.Open; QuickRep1.Preview; // se o seu form eventualmente não é destruído, convém // fechar as consultas após concluída a apresentação do relatório // do contrário, você pode omitir estas linhas, visto que ao destruir o form // os datasets que ESTÃO NELE, serão fechados ao serem destruídos. IBQuery1.Close; IBQuery2.Close; IBQuery3.Close; end; - Na unit onde está o form que chama este relatório (vou chamá-lo FrmContPag), supondo que tal evento ocorra ao clicar de um botão (vou chama-lo btnImpContPag) e que a data de referência e número de dias venham de edits (edDataRef e edNumDias) o código deveria ficar: procedure TFrmContPag.btnImpContPag(Sender :TObject); begin FrmImpRelContPag := TFrmImpRelContPag.Create(Self); try FrmImpRelContPag.ShowPreview(StrToDate(edDataRef.Text), StrToInt(edNumDias)); finally FrmImpRelContPag.Free; end; end; 4) Preparação do relatório QuickRep... O componente QuickRep1 deverá ter como tabela guia a nossa consulta mestre, já que queremos que as informações sejam mostradas na ordem que lá determinamos. Assim, selecionamos em sua propriedade DataSet o dataset IBQuery1. Obs: Para efeito de andamento da impressão, cada vez que é processada uma linha do dataset, a banda detalhe estará sendo “impressa”. Nós sabemos que para cada linha do dataset mestre, poderá haver várias linhas no dataset detalhe IBQuery3 que representam os n itens relacionados a ele. A isto chamamos de sub-detalhe, de modo que para mostrar estas informações, faremos uso de uma banda SubDetail. Assim, já teríamos condições de montar o relatório com esta estrutura...: configuração dos componentes QRDBText:Vencimento: (dataset: IBQuery1; datafield: DataVencmto) Valor: (dataset: IBQuery1; datafield: Valor) Credor: (dataset: IBQuery2; datafield: NomCli) Item: (dataset: IBQuery3; datafield: Descricao) Qtde: (dataset: IBQuery3; datafield: Qtde) ... e ter este resultado: Obs: infelizmente a tag QUOTE bagunça um pouco as tabulações, removendo os espaços. Mas vale o conceito. ;) Problema) mostrar a data do vencimento e o valor da conta a pagar após os itens listados, e não antes como temos, já que estão associados à detalhe – mestre. Solução: isto, deveríamos ter uma espécie de DetailFooter, já que ele supostamente viria depois do SubDetail, mas isto não existe. Então o que fazemos é avaliar a situação e verificar que todos os itens correspondem ao mesmo grupo CodPg. Vamos, então, adicionar um QRGroup (QRGroup1) e definir um grupo baseado neste campo. Assim, configuramos a sua propriedade Expression com IBQuery1.CodPg, porém esta banda é colocada acima da banda Detail e por isso, adicionamos um QRBand e mudamos sua propriedade BandType para rbGroupFooter e renomeamos ela para QRGroupFooter1 e nesta banda colocamos os campos Vencimento e Valor. Na propriedade FooterBand da QRGroup1, devemos selecionar a banda QRGroupFooter1. A nova estrutura deverá ficar assim: E ter este resultado, bem próximo do desejado: Mas o objetivo é mostrar, ainda, o sub-total agrupado por data do vencimento. Novamente, para colocarmos esta informação ao final do grupo, vamos necessitar de mais um par QRGroup e QRBand. A banda QRGrou2 deverá ter sua propriedade Expression com IBQuery1. DataVencmto e a QRBand deve ter sua propriedade BandType alterada para rbGroupFooter e ser renomeada para QRGroupFooter2. Na propriedade FooterBand da QRGroup2, devemos selecionar a banda QRGroupFooter2. Você vai observar que este conjunto ficou mais próximo à banda Detail, ou seja, como um grupamento mais interno. Só que, na verdade, queremos que ele seja mais externo. Para resolver isto, clique com o botão direito sobre a QRGroup2 e, no menu de contexto, selecione “Move group up” – pronto, cada coisa no seu lugar. Obs: Este “probleminha” só ocorreu porque eu estou construindo passo a passo o relatório (de forma didática). Na prática, você poderá evitar isto, adicionando as bandas desejadas antes e depois configurando elas. A estrutura final do relatório ficará assim: configuração do componente QRExpr:Sub-total: (Expression: IBQuery1.Valor; ResetAfterPrint: True) E finalmente, nosso relatório fica com este aspecto: Bom, ele não é infalível, já que não é muito fácil programar virtualmente, mas podemos ir arredondando as coisas, se necessário. ;) Abraços -
(Resolvido) Relatório usando duas tabelas filhas sem usar tabela
pergunta respondeu ao Tatiane.InterArt de Micheus em Delphi, Kylix
correto, eu só me expressei errado, já que será obtido o código do cliente para buscar seu nome na tabela cliente. este é o único filtro aplicado a consulta principal?Este período é informado como? data de início e data de fim, ou apenas 10 ou 15 dias a partir de hoje? -
(Resolvido) Relatório usando duas tabelas filhas sem usar tabela
pergunta respondeu ao Tatiane.InterArt de Micheus em Delphi, Kylix
Antes de prosseguir confirme se a origem dos dados, para cada bloco, está correta como eu entendi: Credor: MPEL // Ref. ao Cliente, vem de ContasPagar - CodCli Origem Item: Papel Sulfite Qtde:10 // Ref. ao item, vem de ItemContPg - Descricao, Qtde Vencimento:01/01/08 Valor:35,00 // Ref. ao total dos itens, vem de FormaPagto - DataVencmto, Valor -
darth_ivan, me ocorreu o seguinte, nas características de uso destas suas aplicações, você poderia por acaso ter a aplicação filha em uma DLL? Como vão operar estas suas aplicações? Abraços
-
Isto ocorre porque o group retorna apenas uma linha de cada agrupamento. Se em algum momento a região continua a mesma, mas o estado muda, haverá mais que uma linha com a mesma região, mas apenas um estado. A menos, é claro que os outros campos para este mesmo estado também possam variar - daí o processo se repete. fiquei curioso quanto ao seu SELECT ter este aspecto: SELECT policia_militar.descricao_pm, policia_militar.url_pm,estado.cod_estado, regiao.cod_regiao, regiao.regiao FROM regiao, estado, policia_militar WHERE regiao.cod_regiao = estado.cod_regiao AND estado.cod_estado = policia_militar.cod_estado GROUP BY regiao.cod_regiao, estado.cod_estadoe não acusar erro. Até onde sei, a regra básica para GROUP BY é que: todas as colunas no SELECT que não sejam funções de agregação (SUM, MAX, MIN,...) devem ser repetidas na cláusula GROUP BY. Abraços
-
good guy, qual seria sua intenção ao colocar esta linha no loop inicial de leitura do texto?char *strncpy(char *str1,char *str); Primeiramente, você aqui deve ter um erro de compilação (novamente). E por final, este função requer um 3º parâmetro que seria o número máximo de caracteres a copiar. Bom, de acordo com a idéia que você propôs, os erro estão em: 1) str="texto"; troque por: str=texto; (assim, str receberá o conteúdo de texto) 2) char *strncpy(char *str1,char *str); conserte e mova para fora do loop: strncpy(str1,str,i); (copia de str para str1 a quantidade de caracteres entrados i) 3) printf("%c",str1); para imprimir corretamente o texto "decodificado", use assim: printf(str1); (imprime toda a string) Código "corrigido": #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <conio.h> int main(int args, char * arg[]) { int i,j,n; char optei; char texto[30]; char *str, *str1; str=texto; do { system("CLS"); printf("Entre com o texto a ser codificado:\n"); for (i=0; i<30; i++) { scanf("%c",&texto[i]); if (texto[i] == '.') break; } strncpy(str1,str,i); n = i; printf("Texto com %d caracteres.\n", n); for (i = 0; i<n; i++) texto[i] = (5*texto[i] + 100) % 256; printf("Texto codificado:\n"); for (i=0;i<n;i++) printf("%c",texto[i]); printf("\n"); printf("Texto decodificado:\n"); printf(str1); printf("\n\n"); printf("Continua? (S/N): "); optei = toupper(getche()); } while (optei == 'S'); printf("\n"); system("PAUSE"); return 0; } Quanto a decodificar, na verdade você não decodifica nada - você está ciente disto certo? Abraços p.s. Lembre-se de utilizar a tag CODE para deixar o código mais fácil de ler. ;)
-
Eder, a título de explicação a propriedade Values é apenas uma forma (muito boa) de ler o par campo=valor existentes na propriedade Items (TString). Ou seja, toda a linha adicionada à items que esteja no formato nome=valor pode ser acessado através de Values. Quando buscando um campo que não exista, é retornado nulo. O seu problema reside justamente nesta última característica. Observe esta parte do código em SendMail em que é contabilizado a quantidade de anexo: ... AttachCount := 0; for i1 := 0 to MaxInt do begin If Mail.Values['attachment' + IntToStr(i1)] = '' then break; Inc(AttachCount); end; ... percebeu agora? Supondo que o 3º arquivo não existisse, você não teria criado o "campo" attachment2, logo, sendo nulo o resultado, a contagem parou em 2 e será esta a quantidade de anexos a enviar. Para contornar a situação, teremos que agregar o indexador à palavra attachment na medida em que o arquivo exista. procedure <inicialização do e-mail> var ... AttchIdx :byte; // o máximo será 255 PrgPath :string; procedure AttachFile(FileName :String); begin If FileExists (PrgPath +FileName) then begin mail.values[Format('attachment%d', [AttchIdx])] := PrgPath +FileName; Inc(AttchIdx); // índice do próximo anexo end; end; begin ... AttchIdx := 0; PrgPath := ExtractFilePath(Application.ExeName); AttachFile('\jpg\' + edit5.text + 'S1.jpg'); AttachFile('\jpg\' + edit5.text + 'S2.jpg'); AttachFile('\jpg\' + edit5.text + 'E1.jpg'); AttachFile('\jpg\' + edit5.text + 'E2.jpg'); AttachFile('\jpg\' + edit5.text + 'SE1.jpg'); AttachFile('\jpg\' + edit5.text + 'SE2.jpg'); AttachFile('\jpg\genera.jpg'); AttachFile('\pdf\'+ComboRp.TEXT + '.PDF'); ... SendMail(.....) end;Acredito que isto resolva seu problema. OBS: 1) quando se fizer necessário utilizar o retorno de uma função tantas vezes, como no caso de ExtractFilePath, fica, como dica de otimização, atribuí-lo a uma variável e fazer uso desta; 2) criar pequenas procedures locais(como AttachFile) podem trazer alguns benefícios, melhorar a compreensão do código, bem com, dar uma boa enxugada nele; 3) observe a posição da declaração da procedure AttachFile. Ela vem depois da cláusula VAR, porque ela "exerga" e manipula a variável AttchIdx que já deve ter sido declarada antes de seu uso. Abraços p.s. Desculpe editar o código da sua função SendMail no outro post, mas tentar entender a lógica de qualquer código sem identação é quase insano.
-
Não está não. :blink: Joana, dê uma olhada neste tutorial do colega Prog'amador: Criando Um Relatório no QuickReport Passo a Passo Qualquer dúvida post aqui. ;)
-
(Resolvido) Relatório usando duas tabelas filhas sem usar tabela
pergunta respondeu ao Tatiane.InterArt de Micheus em Delphi, Kylix
Tatiane, primeiramente um dica: não use o * em seus selects. Sempre indique apenas os campos que você vai realmente utilizar. Isso evita trafego desnecessário na rede, menos buffer alocado, menos carga para o servidor a cada solicitação. Ficou meio estranho você citar a tabela FormaPagto e usar PagtoContaPg na querie, e como os campos de ligação são diferentes em ambos (CodContaPg e CodOrc) fica complicado ter certeza do que "falar". Nesta linha, parece que você monta sua consulta "mestre": FrmImpRelContPag.IBQuery1.SQL.Add('Select * from PagtoContaPg '+Pes+'order by Data'); e Pes provavelmente contém a cláusula WHERE que fará seu fitro principal. Este dataset também deve ser o dataset de origem de dados para o QuickRep (propriedade DataSet), certo?! Mas, montar a query das outras consultas "detalhe": rmImpRelContPag.IBQuery2.SQL.Add('Select * from ItemContPag where CodContPag='''+FrmImpRelContPag.IBQuery1CodOrc.Value+''''); significa limitar o resultado delas apenas à um registro (linha) da consulta "mestre", já e os campo utilizados na concatenação corresponderão aos do primeiro registro na consulta e a string SQL conterá este valor fixo. Você deverá fazer estas consultas "detalhes" de tal modo que a cada registro da consulta "mestre" que seja selecionado e impresso pelo quickreport, elas seja atualizadas e seus dados impressos corretamente. Para fazer isto, você deve fazer uso da parametrização. Posts em que já falei sobre isto: - Relatório Mestre/detalhe Com Adoquery - post#4 e post#8 - tem exemplo). - Instrução SQL - Duplica Registros Quickreport, Uma unica tabela trabalhando - Relatório - Criar Grupos Basicamente, voce cria as consultas filhas de modo que na cláusula WHERE você define um parâmetro com mesmo nome do campo de onde ele deverá obter a informação (consulta "mestre") Dê uma olhada nos post e veja se você consegue seguir. Abraços -
(Resolvido) EDatabaseErro (conexão banco de dados)
pergunta respondeu ao Alex Ferreira de Micheus em Delphi, Kylix
Alex, como o Jhonas já traduziu para você, a mensagem indica: "Tipo incorreto para o Field ´UsuSenha´, experado: Integer atual:String" Se quando ocorre este erro, o programa pára na linha (ou na seguinte): UDM2.ConexaoADO.ADO_Usuarios.Open; então, dê um duplo-click no seu dataset ADO_Usuarios, exclua o Field UsuSenha e adicione o campo novamente (Add all fields). Isto poderia ser em função de você inicialmente ter declarado, no banco, o campo como Integer e posteriormente mudado para varchar, sendo que os Fields já estavam no dataset. Na seqüência proceda com a correção que o Jhonas citou. eu observei que você está usando um "caminho" bem longo para uso do componentes: UDM2.ConexaoADO.ADO_Usuarios.Open; ao que parece este UDM2 é o nome da Unit, onde o datamodule ConexaoADO armazena o dataset ADO_Usuarios. Isto é certo? Se for, então, fica a dica de que você não precisa referenciar a unit deste modo - basta que ela esteja incluída na cláusula uses (e já deve estar). Assim, você usaria apenas: ConexaoADO.ADO_Usuarios.Open; ou ainda pode fazer uso da instrução with ... do: with ConexaoADO do begin ADO_Usuarios.Open; FrmMenuPrin.StatusBar1.Panels[2].Text := ' Usuário:' + FrmLogin.EdtApelido.Text + ' - '+ ADO_UsuariosUsuDepto.AsSTring; ... end; Abraços -
Sem resposta do membro à MP de confirmação e como a solução apresentada foi no banco, estou devolvendo o tópico para Pastgres.
-
BurnOS, se crm_medico é o campo chave que você usará para excluir, então acho que só faltou mesmo na sua instrução SQL trocar o * pelo campo que deverá ser retornado e comparado - crm_medico. delete from inclusao where crm_medico = (select crm_medico from inclusao inner join cadastromedico on inclusao.crm_medico = cadastromedico.crm_medico) Abraços
-
Na unha? Isso é que é querer sofrer... :D Se não for com aplicativo, só na unha mesmo, porque o Access (que me lembre) não tem opção de exportação da estrutura do banco (metadata), logo, vai ter que criar o script com todos os creates (tables, index, constraints,...) para o MySQL. Depois disto, até dá para gerar os INSERTs, a partir de uma consulta SQL que resulte o string a ser utilizado no script para transferência dos dados para o MySQL. Um exemplo: SELECT 'INSERT ControleHoras (NrMatricula, DtReferencia, QtHoras, DsMotivoHora) VALUES ('+Str(NrMatricula)+', ''' +Format([DtReferencia],"yyyy-mm-dd") +''', ''' +STR(QtHoras) +''', ''' +DsMotivoHora +''');' AS INSERT_CMD FROM ControleHorasSimples; uma amostra do resultado: que pode ser selecionado, copiado e colado no arquivo de texto - script - no bloco de notas. Bom, eu não me arriscaria a tanto trabalho não. Ainda início do mês fiz este processo utilizando a ferramenta MySQL Migration Toolkit que faz parte do MySQL GUI Tools (para versão MySQL 5). Ele tem um wizard bem interessante e a conversão é simples. Abraços e boa sorte.
-
no código que você postou não aparece a declaração de str1, qual seria? Ah! O ideal é que você poste a mensagem de erro que ocorre (original), assim é mais fácil de alguém auxiliá-lo. ;) Abraços
-
vms, a pesquisa incremental em campos numéricos não funcionam muito bem (dependendo do que você espera). Supondo que você imagine que esta pesquisa se dê da mesma forma que a realizada com strings, então, seria razoável considerar que ao digitar 2, sua consulta comece a mostrar apenas os números que começam com 2, então em um banco grande você poder ter resultados neste formato (baseado em LIKE <valor>+%): +------+------+------+ |campo1|campo2|campo3| +------+------+------+ | 2| | | 21| | | 22| | | 23| | ... | 200| | | 201| | | 202| | ... | 2000| | | 2001| | | 2002| | +------+------+------+ Se for isto o esperado, vale lembrar que você terá que converter o campo numérico em questão para string - isso pode ser feito na consulta apenas. Veja este tópico. E para entender o a finalidade dos %, apresentados pelo Jhonas, dê uma olhada neste post. Abraços
-
Veja este exemplo que empacota um arquivo HTML (observe que só trocou o tipo - não há qualquer diferença no processo).
-
Em que linha ocorre o erro? Experimente trocar: Result := qryTmp.FieldByName('DATA').Value; por: Result := qryTmp.FieldByName('DATA').AsDate; // ou AsDateTime
-
Ele tem extensão sim e é ZIP, talvez você tenha gravado sem a extensão. De qualquer modo, você pode baixar ele do link 4Share ali abaixo na minha assinatura (vá em Programacao\Sockets)