Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

acfelipesilva

Problemas com Insert

Recommended Posts

Olá Gente,

 

Tudo bom? Bem, necessito da ajuda de vocês para conseguir dar tratamento a um erro que está acontecendo quando tento realizar um insert na minha tabela de fornecedores... O campo tá definido na tabela como smalldatetime, porém tá aparecendo o erro abaixo... Vou postar para vocês a minha sp, o erro, e como chamo a sp pelo asp... Quem poder ajduar eu agradeço!

 

O Erro:

Error converting data type varchar to smalldatetime.

 

Os parâmetros que o ASP repassa:

exec sp_IncluirFornecedorCPF '51222981220' , 'AUGUSTO TESTE' , 'TESTE' , '123' , 'TESTE' , 'MARCO' , 'BELEM' , '1900-01-01 00:00:00' , 'PA' , '91 32762299' , '91 91128955' , '14569' , 'F' , 'TESTE', 'ACFELIPE@MASN.COM.BR' , 123 , '123' , '1234', '9' , '22101980' , '12' , '00201'

 

Minha SP

ALTER   procedure dbo.sp_IncluirFornecedorCPF	  @for_cgccpf		varchar(15)		,@for_nome		varchar(50),@for_rua		varchar(50),@for_numero		varchar(5),@for_complemento	varchar(15),@for_bairro		varchar(30),@for_cidade		varchar(30),@for_cep		varchar(8),@for_uf		varchar(2),@for_fone1		varchar(12),@for_fone2		varchar(12),@for_ctacorrente	varchar(10),@for_tipopessoa	varchar(2) = 'F',@for_observacao	varchar(200),@for_email		varchar(50)	,@for_cod_banco		numeric(10),@for_inscr_inss	varchar(20),@for_pis_pasep		varchar(20),@for_dv_ctacorrente	varchar(2),@for_CBO		varchar(6),@for_dta_nasc		smalldatetime = '1900-01-01 00:00:00',@for_ag_cod		varchar(10)AS   	  set nocount on	  If not exists (select * from fornecedor where for_cgccpf=@for_cgccpf)	  BEGIN insert into fornecedor(	for_cgccpf,for_nome,for_rua,for_numero	,for_complemento,for_bairro,for_cidade,for_cep	,for_uf,for_fone1,for_fone2,for_ctacorrente	,for_tipopessoa,for_observacao, for_email, for_cod_banco	,for_inscr_inss,for_pis_pasep,for_dv_ctacorrente	,for_dta_nasc,for_ag_cod,for_CBO)	   	values(	@for_cgccpf,@for_nome,@for_rua,@for_numero	,@for_complemento,@for_bairro,@for_cidade,@for_cep	,@for_uf,@for_fone1,@for_fone2,@for_ctacorrente	,@for_tipopessoa,@for_observacao,@for_email,@for_cod_banco	,@for_inscr_inss,@for_pis_pasep,@for_dv_ctacorrente	,@for_dta_nasc,@for_ag_cod,@for_CBO)	  End

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se no exemplo que você passou a data é o '22101980'... procure alterar para '10/22/1980' (mm/dd/yyyy).O sql server não esta conseguindo converter o '22101980' em uma data válida.T+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Brother,

 

Modifiquei isso no momento em que o usuário digita a data, no evento onkeypress... Bom, continua dando o erro

 

Server: Msg 8114, Level 16, State 4, Procedure sp_IncluirFornecedorCPF, Line 0Error converting data type varchar to smalldatetime.

Estes são os novos parâmetros que passei, porém não adiantou muito...

SET DATEFORMAT DMY exec sp_IncluirFornecedorCPF '51222981220' , 'AUGUSTO CESAR' , 'dssadas' , '1231' , 'adsasd' , 'marco' , 'belem' , '66610160' , 'PA' , '91 32762299' , '91 32762299' , '1313' , 'F' , 'TESTE', 'acfelipe@gmail.com' , 124 , '1231245' , '211', '9' , '22/10/1980' , '1465' , '00103'

Alguma outra sugestão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A bronca como já deu para ver é no momento do da execução da sql de inserrção de dados. Agora vamos por parte para que possa repassar corretamente minhas dificuldades. Fiz algumas correções no código afim de eliminar o problema mas não deu certo...1 - Esse é o erro que está dando agora:

Server: Msg 8114, Level 16, State 4, Procedure sp_IncluirFornecedorCPF, Line 0Error converting data type varchar to smalldatetime.
2 - Essa é SQL que passo para chamar SP através do ASP:

sql = " SET DATEFORMAT DMY "sql = sql & "exec sp_IncluirFornecedorCPF '" & var_cpf & "' , '" & var_nome & "' , '" & var_logradouro & "' , '" & var_num & "' , '" & var_complemento & "' , '" & var_bairro & "' , '" & var_cidade & "' , '" & var_cep & "' , '" & var_uf & "' , '" & var_tel & "' , '" & var_fax &"' , '" & var_cta & "' , '" & var_pessoa & "' , '" & var_obs & "', '" & var_mail & "' , " & var_ban & " , '" & var_inscinss & "' , '" & var_pispasep & "', '" & var_digconta & "' , '" & var_dtanasc & "' , '" & var_age & "' , '" & var_cbo & "'"SET DATEFORMAT DMY exec sp_IncluirFornecedorCPF '51222981220' , 'AUGUSTO CESAR' , 'dssadas' , '1231' , 'adsasd' , 'marco' , 'belem' , '66610160' , 'PA' , '91 32762299' , '91 32762299' , '1313' , 'F' , 'TESTE', 'acfelipe@gmail.com' , 124 , '1231245' , '211', '9' , '22/10/1980' , '1465' , '00103'

3 - Essa é a minha sp no sql server
SET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS ON GOALTER   procedure dbo.sp_IncluirFornecedorCPF	  @for_cgccpf  varchar(15)  ,@for_nome  varchar(50),@for_rua  varchar(50),@for_numero  varchar(5),@for_complemento varchar(15),@for_bairro  varchar(30),@for_cidade  varchar(30),@for_cep  varchar(8),@for_uf  varchar(2),@for_fone1  varchar(12),@for_fone2  varchar(12),@for_ctacorrente varchar(10),@for_tipopessoa varchar(2) = 'F',@for_observacao varchar(200),@for_email  varchar(50) ,@for_cod_banco  numeric(10),@for_inscr_inss varchar(20),@for_pis_pasep  varchar(20),@for_dv_ctacorrente varchar(2),@for_CBO  varchar(6),@for_dta_nasc  smalldatetime = '1900-01-01 00:00:00',@for_ag_cod  varchar(10)AS   	  set nocount on	  If not exists (select * from fornecedor where for_cgccpf=@for_cgccpf)	  BEGIN insert into fornecedor( for_cgccpf,for_nome,for_rua,for_numero ,for_complemento,for_bairro,for_cidade,for_cep ,for_uf,for_fone1,for_fone2,for_ctacorrente ,for_tipopessoa,for_observacao, for_email, for_cod_banco ,for_inscr_inss,for_pis_pasep,for_dv_ctacorrente ,for_dta_nasc,for_ag_cod,for_CBO)	    values( @for_cgccpf,@for_nome,@for_rua,@for_numero ,@for_complemento,@for_bairro,@for_cidade,@for_cep ,@for_uf,@for_fone1,@for_fone2,@for_ctacorrente ,@for_tipopessoa,@for_observacao,@for_email,@for_cod_banco ,@for_inscr_inss,@for_pis_pasep,@for_dv_ctacorrente ,@for_dta_nasc,@for_ag_cod,@for_CBO)	  End	  GOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GO
4 - As variáveis que capturo da página ASP
var_cpf = Trim(Request.Form("cpf"))   var_nome = ucase(Request.Form("nome"))	var_dtanasc = Trim(Request.Form("dtanascimento")) var_cbo = Trim(Request.Form("cbo"))	 var_inscinss = Trim(Request.Form("inscinss"))  var_pispasep = Trim(Request.Form("pispasep"))  var_logradouro = Trim(Request.Form("logradouro")) var_complemento = Trim(Request.Form("complemento")) var_num = Trim(Request.Form("numendereco"))   var_cep = Trim(Request.Form("cep"))  var_bairro = Trim(Request.Form("bairro"))   var_cidade = Trim(Request.Form("cidade"))   var_uf = Trim(Request.Form("estado"))	var_tel = Trim(Request.Form("telefone"))	var_fax = Trim(Request.Form("fax"))	 var_ban = Trim(Request.Form("banco"))	var_age = Trim(Request.Form("agencia"))	var_cta = Trim(Request.Form("conta"))	var_obs = Trim(Request.Form("observacao"))   var_digconta = Trim(Request.Form("digconta"))  var_mail = Trim(Request.Form("email"))var_pessoa = Trim(Request.Form("tipodepessoa"))
Bom, meus amigos é isso!Pela msg do erro o problema está na data de nascimento, né? É problema de conversão?Caso vocês tenham alguma idéia, eu agradeço!!!MisterPê: Vou implementar como você sugeriu, ok?!?! Mas senão der certo, pensei aí em uma outra solução (rs), você vai quebrar uma arvore (rs), obrigado!!!Um abraço,Augusto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além do post indicado pelo eriva, que detalha bem como trabalhar com as datas, seria interessante você entender que ao tentar converter um char / varchar para smalldatetime o sql server vai tentar ajustar para o formato "mm/dd/yyyy".

 

Como sua data é "22/10/2007", acontece o erro, pois "22" não é um mês válido. Basta inverter para "10/22/2007" que tudo deve funcionar.

 

Por exemplo :

 

declare @DataChar varchar(10);set @DataChar = '10/22/2007'select convert(smalldatetime,@DataChar)Resulta...  2007-10-22 00:00:00Agora...declare @DataChar varchar(10);set @DataChar = '22/10/2007'select convert(smalldatetime,@DataChar)Resulta erro... The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ErivaBr e MisterPE,

 

Obrigado pela ajuda de vocês, me ajudaram muito a resolver outros problemas relacionados a trabalho com datas, mas o problema em foco não consegui resolver não (rs)...

Mas agora tá bem px, já sei que o problema está no campo @for_dta_nasc, ele sai do formulário ASP no formato brasileiro "dd-mm-yyyy", e entra em conflito, gerando erro no BD sql server (este com datas no formato americano "yyyy-mm-dd")...

Bom, conforme li os artigos que vcs indicaram, me "amarrei" em fazer um script que trate as datas vindas no formato brasileiro e repasse para o formato americano, vcs podem dar uma olhada na parte comentada do código, foi onde tentei fazer os testes q não deram certo... Logo, solicito a vcs uma força na elaboração desse código (se possível é claro)?!?!?!?

 

Quando passa os parametros da sp modificando o formato data na unha, grava que é uma beleza... Porém como poderei fazer o tratamento disso, isto é, como elaboro um código que já faça isso automaticamente pra mim?

 

Esse é o código modificado e que funciona na unha...

 

exec STP_INSERIR_FORNECEDOR '5122298120','ASDASDAS', null,'1980/10/22','00203', null, null,'','','','','','','','','','','','',123,,'','F','', null, ''

 

ALTER	  procedure dbo.STP_INSERIR_FORNECEDOR @for_cgccpf			varchar(15) = null	  ,@for_nome   		  varchar(50) = null	  ,@for_nome_fantasia	  varchar(50) = null	  ,@for_Dta_Nasc	  datetime = null	  ,@for_CBO   		varchar(6) = null,@for_inscr_estadual	  varchar(20) = null	  ,@for_inscr_municipal	  varchar(20) = null	  ,@for_inscr_inss	  varchar(20) = null	  ,@for_pis_pasep	  varchar(20) = null	  ,@for_rua   		varchar(50) = null	  ,@for_numero   		varchar(5) = null	  ,@for_complemento	  varchar(15) = null	  ,@for_cep   		varchar(8) = null	  ,@for_bairro   		varchar(30) = null	  ,@for_cidade   		varchar(30) = null	  ,@for_uf   		varchar(2) = null	  ,@for_fone1   		varchar(12) = null	  ,@for_fone2   		varchar(12)  = null	  ,@for_email   		varchar(50) = null	  ,@ban_cod   		numeric = null	  ,@age_cod   		int  = null	  ,@for_ctacorrente	  varchar(10) = null ,@for_tipopessoa	  varchar(1) = null		,@for_dv_ctacorrente	  varchar(2) = null	  ,@for_restricao   	int  = null	  ,@for_observacao	  varchar(200) = null  AS	   	  [color="#0000FF"]--DECLARE @for_Dta_Nasc VARCHAR(10)--CONVERT(VARCHAR(12),@for_Dta_Nasc,120) AS '120'--SET VAR_DATANASC = CONVERT(datetime, @for_Dta_Nasc) --CONVERT(VARCHAR, GETDATE(), 103)  [/color]IF NOT EXISTS(SELECT * from fornecedor where for_cgccpf = @for_cgccpf)	  	BEGIN	BEGIN TRANSACTION	  	 INSERT INTO fornecedor (	for_cgccpf, for_nome, for_nome_fantasia,	for_Dta_Nasc, for_CBO, for_inscr_estadual,	for_inscr_municipal, for_inscr_inss, for_pis_pasep,	for_rua, for_numero, for_complemento, for_cep,	for_bairro, for_cidade, for_uf, 	for_fone1, for_fone2, for_email,	ban_cod, age_cod, for_ctacorrente, 	for_tipopessoa, for_dv_ctacorrente, for_restricao,	for_observacao)	   	 VALUES (	@for_cgccpf, @for_nome, @for_nome_fantasia,	@for_Dta_Nasc, @for_CBO, @for_inscr_estadual,	@for_inscr_municipal, @for_inscr_inss, @for_pis_pasep,	@for_rua, @for_numero, @for_complemento, @for_cep,	@for_bairro, @for_cidade, @for_uf, 	@for_fone1, @for_fone2, @for_email,	@ban_cod, @age_cod, @for_ctacorrente, 	@for_tipopessoa, @for_dv_ctacorrente, @for_restricao,	@for_observacao)	   	 IF @@ERROR <> 0	   		  ROLLBACK TRANSACTION	  	  ELSE	  		  COMMIT TRANSACTION	  	 ENDELSE	BEGIN	BEGIN TRANSACTION	  	 UPDATE fornecedor 	SET for_cgccpf = @for_cgccpf, for_nome = @for_nome, for_nome_fantasia = @for_nome_fantasia,	for_Dta_Nasc = @for_Dta_Nasc, for_CBO = @for_CBO, for_inscr_estadual = @for_inscr_estadual,	for_inscr_municipal = @for_inscr_municipal, for_inscr_inss = @for_inscr_inss, for_pis_pasep = @for_pis_pasep,	for_rua = @for_rua, for_numero = @for_numero, for_complemento = @for_complemento, for_cep = @for_cep,	for_bairro = @for_bairro, for_cidade = @for_cidade, for_uf = @for_uf, 	for_fone1 = @for_fone1, for_fone2 = @for_fone2, for_email = @for_email,	ban_cod = @ban_cod, age_cod = @age_cod, for_ctacorrente = @for_ctacorrente, 	for_tipopessoa = @for_tipopessoa, for_dv_ctacorrente = @for_dv_ctacorrente, for_restricao = @for_restricao,	for_observacao = @for_observacao	  WHERE (for_cgccpf = @for_cgccpf)	  	  IF @@ERROR <> 0	   		  ROLLBACK TRANSACTION	  	  ELSE	  		  COMMIT TRANSACTION	  	  END

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu galera, consegui matar o problema, na verdade foi um trabalho em conjunto (imasters e msdn-br)...Peguei uma dica de cada um e juntei tudo, daí saiu o resultado...

Tô postando aí para a galera que tiver esse problema também consiga resolver, como eu consegui...

 

 

ALTER	  procedure dbo.STP_INSERIR_FORNECEDOR @for_cgccpf	  varchar(15) = null	  ,@for_nome	   varchar(50) = null	  ,@for_nome_fantasia   varchar(50) = null	  ,@for_Dta_Nasc   varchar(10) = null	  ,@for_CBO	 varchar(6) = null,@for_inscr_estadual   varchar(20) = null	  ,@for_inscr_municipal   varchar(20) = null	  ,@for_inscr_inss   varchar(20) = null	  ,@for_pis_pasep   varchar(20) = null	  ,@for_rua	 varchar(50) = null	  ,@for_numero	 varchar(5) = null	  ,@for_complemento   varchar(15) = null	  ,@for_cep	 varchar(8) = null	  ,@for_bairro	 varchar(30) = null	  ,@for_cidade	 varchar(30) = null	  ,@for_uf	 varchar(2) = null	  ,@for_fone1	 varchar(12) = null	  ,@for_fone2	 varchar(12)  = null	  ,@for_email	 varchar(50) = null	  ,@ban_cod	 numeric = null	  ,@age_cod	 int  = null	  ,@for_ctacorrente   varchar(10) = null ,@for_tipopessoa   varchar(1) = null		,@for_dv_ctacorrente   varchar(2) = null	  ,@for_restricao	int  = null	  ,@for_observacao   varchar(200) = null  AS	   	  Declare @Ffor_DTA_Nasc DatetimeSET @Ffor_DTA_Nasc = CONVERT(datetime, @for_Dta_Nasc,103) IF NOT EXISTS(SELECT * from fornecedor where for_cgccpf = @for_cgccpf)	  	BEGIN	BEGIN TRANSACTION	  	 INSERT INTO fornecedor ( for_cgccpf, for_nome, for_nome_fantasia, for_Dta_Nasc, for_CBO, for_inscr_estadual, for_inscr_municipal, for_inscr_inss, for_pis_pasep, for_rua, for_numero, for_complemento, for_cep, for_bairro, for_cidade, for_uf,  for_fone1, for_fone2, for_email, ban_cod, age_cod, for_ctacorrente,  for_tipopessoa, for_dv_ctacorrente, for_restricao, for_observacao)	   	 VALUES ( @for_cgccpf, @for_nome, @for_nome_fantasia, @Ffor_Dta_Nasc, @for_CBO, @for_inscr_estadual, @for_inscr_municipal, @for_inscr_inss, @for_pis_pasep, @for_rua, @for_numero, @for_complemento, @for_cep, @for_bairro, @for_cidade, @for_uf,  @for_fone1, @for_fone2, @for_email, @ban_cod, @age_cod, @for_ctacorrente,  @for_tipopessoa, @for_dv_ctacorrente, @for_restricao, @for_observacao)	   	 IF @@ERROR <> 0	   		  ROLLBACK TRANSACTION	  	  ELSE	  		  COMMIT TRANSACTION	  	 ENDELSE	BEGIN	BEGIN TRANSACTION	  	 UPDATE fornecedor  SET for_cgccpf = @for_cgccpf, for_nome = @for_nome, for_nome_fantasia = @for_nome_fantasia, for_Dta_Nasc = @Ffor_Dta_Nasc, for_CBO = @for_CBO, for_inscr_estadual = @for_inscr_estadual, for_inscr_municipal = @for_inscr_municipal, for_inscr_inss = @for_inscr_inss, for_pis_pasep = @for_pis_pasep, for_rua = @for_rua, for_numero = @for_numero, for_complemento = @for_complemento, for_cep = @for_cep, for_bairro = @for_bairro, for_cidade = @for_cidade, for_uf = @for_uf,  for_fone1 = @for_fone1, for_fone2 = @for_fone2, for_email = @for_email, ban_cod = @ban_cod, age_cod = @age_cod, for_ctacorrente = @for_ctacorrente,  for_tipopessoa = @for_tipopessoa, for_dv_ctacorrente = @for_dv_ctacorrente, for_restricao = @for_restricao, for_observacao = @for_observacao	  WHERE (for_cgccpf = @for_cgccpf)	  	  IF @@ERROR <> 0	   		  ROLLBACK TRANSACTION	  	  ELSE	  		  COMMIT TRANSACTION	  	  END

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.