Ir para conteúdo
Fórum Script Brasil
  • 0

Novo Registro função Dmax


Guest --Alberto Mota --

Pergunta

Guest --Alberto Mota --

Prezados colegas depois de muito pesquisar não encontrei a solução.

No Access para inserir um novo registro num campo numero(tem que ser assim e não autonumeração) uso o seguinte código no evento no atual do form

Me.NumeroPedidoNovo.DefaultValue = "=" & Nz(DMax("NumeroPedidoNovo", "TblVendaSaidaNovo"), 0) + 1

Gostaria de fazer isso no SQLSERVER(capturar o ultimo registro máximo e acrescentar 1 ao novo) .

Pois utilizo Access como front-end e o SQLSERVER será o meu back-end.

Como implemento isso?

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Guest Jefferson Alves

Alberto,

Se o objetivo é obter o último número de chave ou pedido na tabela, basta criar uma stored procedure (função MAX no select) que retorne este valor, lembrando de dar o devido tratamento em caso de inexistência de valor. Espero ter ajudado em algo, a menos que não tenha entendido ainda a sua necessidade.

Jefferson

Prezados colegas depois de muito pesquisar não encontrei a solução.

No Access para inserir um novo registro num campo numero(tem que ser assim e não autonumeração) uso o seguinte código no evento no atual do form

Me.NumeroPedidoNovo.DefaultValue = "=" & Nz(DMax("NumeroPedidoNovo", "TblVendaSaidaNovo"), 0) + 1

Gostaria de fazer isso no SQLSERVER(capturar o ultimo registro máximo e acrescentar 1 ao novo) .

Pois utilizo Access como front-end e o SQLSERVER será o meu back-end.

Como implemento isso?

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Alberto Mota --

Jefferson, bom dia. O que você entendeu é correto.

E como seria essa stored procedure?

você poderia disponibilizar um exemplo, por favor?

Link para o comentário
Compartilhar em outros sites

  • 0

bom vo apagar o otro tópico seu la porque não tem sentido ter dois topicos. mas beleza, pelo menos serviu pra me chama a atencao, pois tinha esquecido desse aqui.

então alberto, acontece q no sql não tem formulario, onde você esta fazendo sua programacao?? você podia fazer isso pela sua linguagem de programcao. a funcao max() retorna o ultimo numero. exemplo:

Select Max(Numero) As Ultimo From Tabela
ou você pode fazer isso na procedure tb como disse o jefferson. primero de tudo, você sabe usar stored procedure?? como eu não sei os detalhes do seu sistema e do q você quer fazer, não sei direito qual parte exatamente preciso te explicar, mas o codigo na procedure seria esse:
Declare @Ultimo Int
    Select @Ultimo = Max(Numero) From Tabela[/code]

ai o ultimo numero vai estar gravado na variavel @Ultimo e você faz o q quiser com ele.

EDITADO:

note q quando a tabela esta vazia (e você tiver q gravar o codigo 1), o Max() vai retornar nulo. ai você ve como quer fazer o teste, pode checar com o Is Null (mais pratico e com menos processamento) ou pode antes fazer um select q retorne o Count(*) e se for 0 você nem pega o Max() e já grava 1.

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Alberto Mota --

Preado Kiori, consegui resolver. Segue o código abaixo da procedure. E o que é mais interesante é que não preciei dela. No Acces, não havia referenciado a biblioteca do ADO e o que antes eu fazia, continua no SQLSERVER.

No Access Coloquei no evento no atual

Me.NumeroPedidoNovo.DefaultValue = "=" & Nz(DMax("NumeroPedidoNovo", "TblVendaSaidaNovo"), 0) + 1

========================

No SQLSERVER

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_inserevda]
AS
Declare @Ultimo Int
Select @Ultimo = Max(NumeroPedidoNovo)+1 From TblVendaSaidaNovo
INSERT Into TblVendaSaidaNovo (NumeroPedidoNovo) 
values (@Ultimo)
E me deparei com outro problema( Não vou abrir um novo tópico). É uma questão de parcelamento onde apenas o campo data dá erro. Segue o código no Access(Projeto ADP)
Private Sub Comando41_Click()
If IsNull(Me.CboDocumento) Then
MsgBox "Informe o tipo de pagamento", 64, "Aviso"
DoCmd.CancelEvent
Exit Sub
End If

Dim oConn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim duplicata As ADODB.Recordset
Dim strConn As String
Set oConn = New ADODB.Connection
Set oRs = New ADODB.Recordset
Set duplicata = New ADODB.Recordset
strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=wa;Initial Catalog=wa;Data Source=ALBERTO-PC\SQLEXPRESS"
oConn.Open strConn

duplicata.Open "TblDuplicatas", oConn
For X = 1 To Me.bytParcelas2.Column(0)
Tipo = Me.CboDocumento
vr = Me.Texto34 / Me.bytParcelas2.Column(0)
Numero = Me.lngNumContrato
dt2 = DateAdd("m", X, Me.DtaEmissao)
SQL = "INSERT INTO TblDuplicatas (BaseNota, ValorDupl, DtVctoDupl, TipoDocumento) VALUES (" & Numero & ",'" & vr & "','" & dt2 & "','" & Tipo & "')"
Set duplicata = oConn.Execute(SQL)
Next

Me.TblDuplicatas.Requery
oConn.Close
Set oConn = Nothing
Set oRs = Nothing
Set duplicata = Nothing
MsgBox "Dados inseridos com sucesso!", 64, "Aviso"
End Sub

A mensagem de erro é a seguinte:

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value

Se for posivel, como faço a conversão em cima desse código? Um abraço.

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Alberto Mota --

Kuroi consegui resolver. Desculpe a demora em retornar. Segue o código. Tive que adaptar uma função de formatação de datas.

Segue o código:

Function FormataMoeda(valor)
 sp = Mid(FormatNumber(1000, 0, -1, 0, -1), 2, 1)
  sv = Mid(FormatNumber(0.1, 1, -1, 0, -1), 2, 1)
  If IsNumeric(valor) Then
    v = FormatNumber(valor, 0, -1, 0, -1)
  Else
    v = FormatNumber(0, 2, -1, 0, -1)
  End If
  v = Replace(v, sp, "p")
  v = Replace(v, sv, "v")
  v = Replace(v, "p", ".")
  v = Replace(v, "v", ",")
  FormataMoeda = v
 End Function

If IsNull(Me.CboDocumento) Then
MsgBox "Informe o tipo de pagamento", 64, "Aviso"
DoCmd.CancelEvent
Exit Sub
End If
Dim oConn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim duplicata As ADODB.Recordset
Dim strConn As String
Set oConn = New ADODB.Connection
Set oRs = New ADODB.Recordset
Set duplicata = New ADODB.Recordset
strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=wa;Initial Catalog=wa;Data Source=ALBERTO-PC\SQLEXPRESS"
oConn.Open strConn

duplicata.Open "TblDuplicatas", oConn
For X = 1 To Me.bytParcelas2.Column(0)
Tipo = Me.CboDocumento
vr = Me.Texto34 / Me.bytParcelas2.Column(0)
vr = FormataMoeda(vr)
Numero = Me.lngNumContrato
dt2 = DateAdd("m", X, Me.DtaEmissao)
d = Day(dt2)
m = Month(dt2)
a = Year(dt2)
DtVcto2 = a & "/" & m & "/" & d

SQL = "INSERT INTO TblDuplicatas (BaseNota, ValorDupl, DtVctoDupl, TipoDocumento) VALUES (" & Numero & ",'" & vr & "','" & DtVcto2 & "','" & Tipo & "')"
Set duplicata = oConn.Execute(SQL)
Next

Me.TblDuplicatas.Requery
Set duplicata = Nothing
MsgBox "Dados inseridos com sucesso!", 64, "Aviso"
End Sub

Estou com problemas na casa decimal( valores tipo conforme a divisão) 1500,67 dá erro. Mas vou pesquisar um pouco mais. Se não conseguir pedirei ajuda. Sucesso!

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Alberto Mota --

Kuroi, resolvido definitivamente. você tinha razão. Capturei as decimais, concatenei com os inteiros e resolveu.

Era relativo ao ponto

Num resultado ex: 1500,67

Inteiros= 1500

decimais= 67

Concatenação = inteiros & "." & decimais = 1500.67

Simples. Obrigado!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...