Clipper On Line • Ver Tópico - Erro na inclusão de registros em mysql

Erro na inclusão de registros em mysql

Discussão sobre SQL

Moderador: Moderadores

 

Erro na inclusão de registros em mysql

Mensagempor cjp » 08 Jun 2014 00:56

Estou enfrentando erro na inclusão de registros em tabela de banco de dados mysql. Fiz uma rotina de teste baseada na função demo que o Toledo postou. Ficou assim:

/*********************************************
* compilar: hbmk2 demo.prg rddsql.hbc sddodbc.hbc
*********************************************/
#include "dbinfo.ch"

#define RDDI_CONNECT     1001
#define RDDI_DISCONNECT   1002
#define RDDI_EXECUTE     1003

ANNOUNCE RDDSYS
REQUEST SQLMIX, SDDODBC

**********************************************
Function Main()
LOCAL nConnection

RDDSETDEFAULT( "SQLMIX" )

SetMode(25,80)

nConnection := RDDINFO( RDDI_CONNECT, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx2;" } )
IF nConnection == 0
Alert("Erro na conexao com o servidor")
Return nil
ENDIF

If CriaTabela()
DBUSEAREA( .T.,, "SELECT * FROM ativ", "ativ" )
INDEX ON FIELD->DATA TAG data TO ativ
GO TOP
Else
Return nil
EndIf

Browse()

DBCLOSEALL()
Return nil

**********************************************
Function CriaTabela()
Local ret := .T., cQuery

cQuery:="DROP TABLE ativ"
RDDINFO(RDDI_EXECUTE, cQuery)

cQuery:="CREATE TABLE ativ ("+;
    "USUARIO char(10),"+;
    "PROGRAMA char(8),"+;
    "DATA datetime,"+;
    "HORA char(8),"+;
    "ACAO char(10),"+;
    "DETALHES char(100),"+;
   "NRTAREFA char(6),"+;
   "PRIORIDADE int(1),"+;
   "CAMPO char(1),"+;
   "TEMPOUSADO decimal(6,1),"+;
   "TEMPOCOMPU decimal(6,1))"
If RDDINFO(RDDI_EXECUTE, cQuery)

cQuery:="INSERT INTO ativ values ('Inacio','demo','08/06/2014','00:49','Teste','Testando','I1',1,'V',1.1,1.2)"
If !RDDINFO(RDDI_EXECUTE, cQuery)
  Alert("Erro ao incluir registros na tabela")
  ret := .F.
EndIf
Else
Alert("Erro ao criar a tabela")
ret := .F.
EndIf
Return ret


A conexão está funcionando, a tabela foi criada, mas está dando erro na inclusão de registros. Já testei várias formas de preencher os dados, mas nada dá certo. Como não dá o código de erro, não consegui saber de onde vem o erro.
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes

Erro na inclusão de registros em mysql

Mensagempor Itamar M. Lins Jr. » 08 Jun 2014 12:44

Tente, fazer o insert um campo de cada vez.
O campo data deve ficar assim:
2014-06-08 YYYY-MM-DD ANOMESDIA!

Mas vai tentando um por um até vc compreender como é o formato de cada um, outra coisa será o campo quando com o valor NIL isso deverá ser tratado por voce.
Explicando: O MySQL grava NIL nos campos quando vazio, a não ser que coloque obrigatoriamente o valor.
Para um campo PRECO/Quantidade vc deve gravar 0,00. Digo forçar ele gravar 0,00 porque senão fica NIL, se não enviar nada. A mesma coisa p/ os campos DATA/Caractere...
"INSERT INTO ativ values ('Inacio','demo',,,,,,,,,)"
Esses campos ai que não foram especificados ficará como NIL
Não é igual ao DBF que ele deixa VAZIO os CAMPOS CARACTERE, 0(zero) os campos numeric...
Tipo VALOR = NUMERIC, tamanho=14, decimais=2 -> no DBF mesmo que não informe durante o REPLACE ele coloca 0,00 no MySQL/PostGreeSQL fica NIL

Tem esse exemplo na pasta contrib.
? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600), ('USA', 'United States of America', 305397000), ('POR', 'Portugal', 10617600), ('POL', 'Poland', 38115967), ('AUS', 'Australia', 21446187), ('FRA', 'France', 64473140), ('RUS', 'Russia', 141900000)" )


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3724
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 129 vezes
Mens.Curtidas: 192 vezes

Erro na inclusão de registros em mysql

Mensagempor Toledo » 08 Jun 2014 14:01

Inácio, o erro deve estar no campo DATA que você definiu como datetime, e o como o Itamar observou o formato para este tipo de campo é yyyy-mm-dd hh:mm:ss (tem a data e hora). Mas observei que no seu código você vai indexar os registros pelo campo data (INDEX ON FIELD->DATA TAG data TO ativ), que provavelmente vai dar um erro, devido o formato do campo, e também notei que na sua tabela tem um outro campo chamado HORA, então acho que no campo DATA você só queria a data mesmo, neste caso você terá que alterar o campo DATA para date e não datetime. O formato de date é yyyy-mm-dd, então você tera que alterar o INSERT também, mudando o formato da data para '2014-06-08'.

Obs.: no início do programa configure a data com o SET DATE BRITISH, assim no browse a data vai sair correta (dd/mm/yyyy).

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3028
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 222 vezes
Mens.Curtidas: 227 vezes

Erro na inclusão de registros em mysql

Mensagempor cjp » 08 Jun 2014 17:51

De fato o erro estava na data. Corrigi e deu certo.

Mas uma coisa que está me intrigando é que não estou conseguindo colocar variáveis no lugar dos dados. Exemplo:

a=Hb_CmdArgArgV()
cQuery:="INSERT INTO ativ values ('Inacio',a,date(),'00:49','Teste','Testando','I1',1,'V',1.1,1.2)"
If !RDDINFO(RDDI_EXECUTE, cQuery)
  Alert("Erro ao incluir registros na tabela")
  ret := .F.
EndIf


Dá erro.

Também tentei:

a=Hb_CmdArgArgV()
cQuery:="INSERT INTO ativ values ('Inacio',"+a+",date(),'00:49','Teste','Testando','I1',1,'V',1.1,1.2)"
If !RDDINFO(RDDI_EXECUTE, cQuery)
  Alert("Erro ao incluir registros na tabela")
  ret := .F.
EndIf


Mas também dá erro.

Também tentei colocar os dados separadamente, assim:

cQuery:="INSERT INTO ativ (USUARIO) values ('Inacio')"
If !RDDINFO(RDDI_EXECUTE, cQuery)
  Alert("Erro ao incluir registros na tabela")
  ret := .F.
EndIf
cQuery:="INSERT INTO ativ (PROGRAMA) values ('demo')"
If !RDDINFO(RDDI_EXECUTE, cQuery)
  Alert("Erro ao incluir 2. registro na tabela")
  ret := .F.
EndIf


Se não usar variável, não dá erro, mas ele inclui dois registros (deve haver algum outro jeito de incluir outro dado no mesmo registro, né?) e só mostra o primeiro, apenas com o primeiro campo; o segundo registro fica vazio.
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes

Erro na inclusão de registros em mysql

Mensagempor Itamar M. Lins Jr. » 08 Jun 2014 18:04

Ola!
testa ai:
Local cNome := "Inacio"
Local cPrograma := "Demo"
cQuery:="INSERT INTO ativ values ('"+cNome+"','"+cPrograma+"')"


Captou ? tem que colocar " ' "+variavel+" ' " ... all right ?

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3724
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 129 vezes
Mens.Curtidas: 192 vezes

Erro na inclusão de registros em mysql

Mensagempor cjp » 10 Jun 2014 00:15

Funcionou, meu caro. Obrigado a todos.
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes

Erro na inclusão de registros em mysql

Mensagempor cjp » 13 Jun 2014 02:20

Meus amigos,

Estou enfrentando o seguinte problema para incluir registros na tabela: se a variável a ser colocada no campo é maior do que o campo, dá erro; se, ao contrário, a variável é menor do que o campo, parece que ele reduz o tamanho do campo ao tamanho da variável, inclusive nos demais registros da tabela.

Ao que me parece, teria que colocar sempre a variável com o tamanho exato do campo. É isso?

Se for isso, o problema será que nem sempre sei o tamanho da variável, para eventualmente completá-la com o número de espaços necessários.

Tentei usar padr(variável,espaço_do_campo), mas também não funcionou.

Como devo fazer?
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes

Erro na inclusão de registros em mysql

Mensagempor Toledo » 13 Jun 2014 08:12

cjp escreveu:se a variável a ser colocada no campo é maior do que o campo, dá erro;

Sim, se o campo da tabela é para 40 caracteres, não tem como colocar mais do que 40. Você terá que limitar o tamanho máximo de caracteres permitidos no campo onde o usuário digita o conteúdo do campo. Se for um campo GET no seu programa Harbour, defina a variável do GET no tamanho certo, agora se for um campo em um formulário numa página HTML ou PHP, também terá que limitar o tamanho do campo, neste caso use o atributo maxlength no campo input do formulário.

cjp escreveu:se, ao contrário, a variável é menor do que o campo, parece que ele reduz o tamanho do campo ao tamanho da variável, inclusive nos demais registros da tabela.

Como você percebe que o tamanho foi reduzido? Isto não tem lógica.

cjp escreveu:Ao que me parece, teria que colocar sempre a variável com o tamanho exato do campo. É isso?

Não necessariamente, o que você tem que se preocupar e de não colocar um conteúdo maior do que o campo aceita, se for menor não tem problema algum.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3028
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 222 vezes
Mens.Curtidas: 227 vezes

Erro na inclusão de registros em mysql

Mensagempor cjp » 13 Jun 2014 09:53

Também acho que não tem lógica, mas, usando o Harbour com base naquele demo que vc fez, no browse esta aparecendo o campo diminuído.

Será que eu estou fazendo algo errado?
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes

Erro na inclusão de registros em mysql

Mensagempor Toledo » 14 Jun 2014 09:32

cjp escreveu:Será que eu estou fazendo algo errado?

Para responder, o único jeito é ver o que você está fazendo.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3028
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 222 vezes
Mens.Curtidas: 227 vezes

Erro na inclusão de registros em mysql

Mensagempor cjp » 14 Jun 2014 18:07

Na verdade não é bem que ele esteja diminuindo o tamanho do campo, mas está mostrando-o limitado. Veja as imagens:

Imagem

Imagem

Estas duas imagens anteriores são de logo após a criação da tabela, com o primeiro registro (coloquei números para facilitar a contagem dos espaços no campo).

Esta próxima é da base com os campos "diminuídos" no browse():

Imagem

E esta é dando um enter no campo, daí ele abre o resto do campo:

Imagem
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes

Erro na inclusão de registros em mysql

Mensagempor cjp » 18 Jun 2014 00:17

Toledo e demais colegas,

Afora o problema acima relatado, estou enfrentando um outro problema eventual nesta função: de vez em quando, a inserção de valores na tabela está retornando falso, sem que haja uma explicação pra isso. Está conectando, mas não está inserindo os valores na tabela. E isso ocorre em alguns casos, em outros não, sendo chamada a função da mesma maneira.

Estou chamando a função assim:

[/code]cadativ("Teste","Testando","I32.dbf","1","Z","3","4")[/code]

E a função está assim:

function cadativ(ac,det,nrt,pr,cp,tu,tc)
         LOCAL nConnection
       local nvz :=0
         _rddantes:=RDDSETDEFAULT( "SQLMIX" )
         nConnection := RDDINFO( 1001, { "ODBC", "Server=mysql.xxx.com.br;Driver={MySQL ODBC 3.51 Driver};dsn=;User=xxx;pwd=xxx;database=xxx;" } )
       do while .t.
            IF nConnection == 0
               if us="I"
               cls
               @ 5,5 say "Erro na conexão com o servidor"
               tone(261.7,nvz*10)
               inkey(20)
               endif
            nvz++
            if nvz>3
                  RDDSETDEFAULT( _rddantes )
               cadativ2(ac,det,nrt,pr,cp,tu,tc,"Não conectou")
                  Return .f.
            endif
         else
            exit
         endif
       enddo
       nvz=0
       cQuery:="INSERT INTO ativ values ('"+nmus+"','"+Hb_CmdArgArgV()+"','"+alltrim(str(year(date())))+"-"+substr(dtoc(date()),4,2)+"-"+substr(dtoc(date()),1,2)+"','"+time()+"','"+ac+"','"+det+"','"+nrt+"',"+pr+",'"+cp+"',"+tu+","+tc+")"
       do while .t.
            if !RDDINFO(1003, cQuery)
             if us="I"
               cls
                  @ 5,5 say "Erro ao incluir registros na tabela Clientes"
               tone(261.7,nvz*10)
               inkey(20)
            endif
            nvz++
            if nvz>5
                  RDDSETDEFAULT( _rddantes )
               cadativ2(ac,det,nrt,pr,cp,tu,tc,"Não incluiu registros")
               return .f.
            endif
         else
            exit
            endif
        enddo
         DBCLOSEALL()
         RDDSETDEFAULT( _rddantes )
Return .t.


Se na maioria das vezes está retornando .t., é porque a função está correta, não?

Pensei em possível problema de conexão à internet, mas aparentemente minha internet está perfeita. Além disso, se está conectando ao banco de dados, imagino que não seja problema de conexão, certo?

Até coloquei a repetição de tentativa 5 vezes para evitar o retorno falso, mas mesmo assim às vezes ele está retornando falso.
Inacio de Carvalho Neto
cjp
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 969
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 6 vezes
Mens.Curtidas: 9 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro