iMasters Fóruns: exibindo consulta sql vb 6 - iMasters Fóruns

Ir para

Página 1 de 1
  • Novo tópico
  • Responder

exibindo consulta sql vb 6 preciso exibir dados como vendedor e outras pessoas

#1 Membro offline   vbnet Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 12
  • Cadastrado: 02-outubro 09

Postou 02 outubro 2009 - 16:05

ola boa tarde sou alexandre desenvolvedor em vb 6 ,esotu com seguinte problema tenho 2 tabelas em um banco dados access tabela pedidodevenda e pessoas utilizo a sql em vb
QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome,razao_social) as VENDEDOR, P.Data AS DATA," 
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave" 
'QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave .

preciso listar a pessoa e o vendedor nesses campos sao gravados numero da chave da pessoa ou vendedor mas somente aparece os campos se forem iguais .
ex: se chavepessoa=chave da tabela pessoa ok
se chavepessoa<>chavevendedor o campo chavepessoa e chavevendedor ficam iguais mesmo que seja diferente o numero da chave

gostaria de listar o vendedor e a pessoa do pedido
ex cod 1 pessoa alex vendedor carlos valor 15,00

preciso de ajuda uma solução sql vb

#2 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 02 outubro 2009 - 18:45

Olá vbnet, primeiramente, seja bem vindo ao fórum.
Caso ainda não tenha lido nossas regras e o queira fazer, aqui estão.

Cara, para ser sincero, não consegui entender o que precisa não.

Mas para ajudar, poste a estrutura de suas tabelas (nomes das colunas) e os dados que precisa pegar exatamente.

Abraços.

#3 Membro offline   vbnet Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 12
  • Cadastrado: 02-outubro 09

Postou 03 outubro 2009 - 17:06

cara boa tarde ,é a primeira vez que participo de uma foro achei bacana o imasters é o seguinte tenho um banco dados access ok neste banco existem diversas tabelas o que acontece hoje tenho 2 tabelas.
"pedido de venda" com os campos chave-num doc-chavepessoa-chavevendedor-valor-status e a tabelas "pessoas" com os campos chave-nome-razao social-tipopessoa-telefone- entre outros campos hoje o que acontece eu uso a instrusao
sql -

QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome,razao_social) as VENDEDOR, P.Data AS DATA,"
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
'QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa
= Pe.Chave" e me mostra em um flexgrid tudo certinho.
ex [Nº DOC]-pessoa-vendedor-data-status-totalpedido-situação quando os campos chavepessoa=chavevendedor ex =chavepessoa da tabela pedidos de venda = chave da tabela pessoas so que tem situações em, que a chavepessoa ´diferente da chavevendedor isso não consigo passar no sql .

ex realizei um pedido de venda onde a chavepessoa é = 1 nome alex e a chavevendedor é = 2 nome carlos entao a pessoa e o vendedor do pedido são diferentes

se eu usar o sql assim :

QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome,razao_social) as VENDEDOR, P.Data AS DATA,"
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
'QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa
= Pe.Chave and P.Chavevendedor
= Pe.Chave " os campos pessoa e vendedor sao mostrados iguais como ex:sitado

pessoa é alex e o vendedor é o alex tambem ;

gostaria que mostrasse os campos pessoa e vendedor como esta gravado

ex:pedido :

numodc - pessoa - vendedor - data - status -
01 alex carlos 01/09 pendente
02 katia alex 01/09 fechado

ja tentei de tudo com inner join e left join e right join
ou outer left join e sempre mesma coisa
obragado;

#4 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 05 outubro 2009 - 10:03

A pessoa é o que? O cliente?

Você está usando sua lógica de forma errada. Da forma como montou sua query, somente irá pegar os dados quando foram iguais mesmo por causa disso:
ON P.ChavePessoa = Pe.Chave and P.Chavevendedor

Você está dizendo que quer os dados somente quando chavepessoa for igual a chavevendedor.

Se não quer isso, precisa retirar essa condição.
Eu aconselho que você tenha uma tabela de pedidos, e nessa tabela você armazena o código da pessoa, o código do vendedor e tenha uma outra tabela com os dados do pedido e armazene o código dessa também na tabela pedidos.

Da forma como está, você não tem uma identificação da pessoa que fez a compra e do vendedor que vendeu.
Não pode selecionar pelas chaves iguais um do outro, pois não tem nada a ver um com outro.
Mas por outro lado, se não colocar uma condição de busca, irá retornar sua tabela toda, e isso também não é bom.

Caso fique ainda com alguma dúvida, avise que vou te direcionar para modelagem SQL, lá poderão lhe dar dicas melhor de como estruturar suas tabelas.

Abraços.

#5 Membro offline   vbnet Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 12
  • Cadastrado: 02-outubro 09

Postou 05 outubro 2009 - 18:12

olá claudio neto boa tarde ,ja tenho os pedidos separados em tabelas diferentes a tabela pessoas eu cadastro o cliente pessoa fisica e o vendedor pessoa fisica ambos tem chaves unicas e na tabela pedidosdevenda quando eu realizo um pedido de venda é gravada a chave da pessoa e a chave do vendedor.
ex cadastrei o cliente alexandre chave=5 e o vendedor carlos chave = 6 ok usando o sql seguinte

QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome,razao_social) as VENDEDOR, P.Data AS DATA," 
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave" 
'QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON Pe.Chave = P.ChavePessoa  and Pe.Chave = P.Chavevendedor 

beleza chavepessoa é igual a chave da tabela pessoa entao mostra e chavevendedor = chave tasbela pessoa enntão mostra

ex: num doc pessoa vendedor data situação

01 carlos carlos pendednte

mas se a chavepessoa é diferente da chavevendedor ex chavepessoa = 5 e chavevendedor = 6 são mostrados
os campos chavepessoa e chavevendedor iguais ex:

ex: num doc pessoa vendedor data situação

01 chave=5 chave=6 pendednte , mas aparece na visualização


ex: num doc pessoa vendedor data situação

01 alexandre alexandre pendednte ,deveria de aparecer a pessoa alexandre e o vendedor carlos ok


ja tentei com left join e right join mas não aparece e as vezes aparece campos em branco se eu usar sinal chavepessoa <> chavevendedor.

tentei com where mas não consegui nenhuma solução como eu faria para listar os
dados quando eles forem diferentes
''-----------------------------------------------------minha sub esta abaixo ---------'
Private Sub ListaPedidos()
    Dim rsP As Recordset
    Dim QSQL As String

          On Error GoTo ListaPedidos_Error

 QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA,iif(pe.pessoa_fisica,nome,razao_social) as VENDEDOR ,P.Data AS DATA,"
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave and P.Chavevendedor = Pe.Chave"
               
                
5             Set rsP = DB.OpenRecordset(QSQL)
6             Set Data1.Recordset = rsP

              'AtualizaRelacao

7             For i = 0 To Ordenar.UBound
8                 flexPedidos.ColWidth(i) = Ordenar(i).width
9             Next
10            flexPedidos.ColWidth(i) = 0
11            Set rsP = Nothing

12           On Error GoTo 0
13           Exit Sub

ListaPedidos_Error:
14            LOG_ERRO Err.Description, Err.Number, Erl, "frmListaPedidos.ListaPedidros"
End Sub

''------------------------------------------------------------------
no iff do sql ele deveria de me mostrar o nome vendedor quando for diferente do nome do cliente que é a pessoa do pedido .
tentei usar o inner dentro de outro mas da erro assim

QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave INNER JOIN PESSOAS VE ON p.ChaveVendedor = ve.Chave" preciso realmente de ajuda grato .

Este post foi editado por Claudio Neto: 06 outubro 2009 - 14:47
Razão por editar:: Adicionado BBCode Code


#6 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 05 outubro 2009 - 18:53

Repare aqui:
iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome,razao_social)


Está selecionando o mesmo dado duas vezes, por isso pessoa está aparecendo duas vezes e nenhuma vez vendedor. Apesar de ter dados alias diferentes, o dado que está puxando do banco é o mesmo.

#7 Membro offline   vbnet Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 12
  • Cadastrado: 02-outubro 09

Postou 06 outubro 2009 - 13:49

tem razao mas como eu poderia fazer entao na sub ,pois na minha tabela pessoa eu tenho o campo chave - tipo - nome para ambos sao iguais a diferenca esta na tipo quando é cliente o tipo é 100000 e pessoa_fisica esta marcado no banco e quando é vendedor o tipo é 001000 e o campo pessoa_fisica tambem esta marcado pois ambos sao pessoas fisica .se o campo pessoa_fisica não esta marcado é porque é pessoa juridica .com esta sub listapedidos apenas consegui visualizar na lista quando pessoa = vendedor mas quando pessoa é <> vendedor mostra igual tentei assim

QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave and P.Chavevendedor = Pe.Chave and P.ChavePessoa <> P.Chavevendedor "mas da erro sintaxe sql

tentei com where


QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave and P.Chavevendedor = Pe.Chave where P.ChavePessoa <> P.Chavevendedor

ex com o iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, na coluna pessoa quando é pessoa fisica me mostra o nome da pessoa quando é juridica me mostra razao_social queria fazer a mesma coisa com o nome vendedor ja que é pessoa fisica
"mas não mostra nada dai tem alguma ideia.

#8 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 06 outubro 2009 - 14:51

Mas você está selecionando o mesmo campo da mesma tabela.

Na sua tabela pedido de venda você está armazenando somente a chave da pessoa e a chave do vendedor, logo precisa pegar em suas respectivas tabelas os dados para exibi-los.
Mas acredito eu que estejam em tabelas diferentes, o cadastro da pessoa em uma e o cadastro do vendedor em outra, ou estou enganado? Caso não esteja, sugiro que separe.
Pois bem, sendo assim, você terá que montar uma query com três tabelas, e não com duas, como está fazendo.
Um exemplo seria assim:

QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pp.pessoa_fisica,nome,razao_social) as PESSOA, iif(pv.pessoa_fisica,nome,razao_social) as VENDEDOR, P.Data AS DATA,"
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
'QSQL = QSQL & " FROM PEDIDOSDEVENDA as p, pessoa as pp, vendedor as pv
where p.Chavepessoa = pp.Chave and pv.Chave = p.Chavevendedor


Só não tenho certeza se o alias das tabelas irá funcionar nesse caso, se não funcionar, altere o alias pelos nomas das tabelas na parte das consultas.

Diga se entendeu o que fiz, senão explico melhor.
PS: Tirei o inner join porque o access não trabalha com join usando mais de duas tabelas.

#9 Membro offline   vbnet Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 12
  • Cadastrado: 02-outubro 09

Postou 06 outubro 2009 - 16:17

sim entendi ,mas chavepessoa e chavevendedor estao na mesma tabela eu uso o inner porque tenho que comparar se a chavepessoa = chave da tabela pessoa mostra o nome da pessoa e se a chave do vendedor = chave da tabela pessoa mostra o nome do vendedor ententeu a query é entre 2 tabelas pessoas e pedidodevenda

ex tentei assim agora :

QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome) as VENDEDOR, P.Data AS DATA,"
3 QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P inner Join pessoas as pe on pe.Chave = p.chavepessoa and pe.Chave = p.chavevendedor "
QSQL = QSQL & "where p.chavepessoa = p.chavevendedor and p.chavepessoa <> p.chavevendedor"

apenas acresentei o QSQL = QSQL & "where p.chavepessoa = p.chavevendedor and p.chavepessoa <> p.chavevendedor"
para comparar quando iguais p.chavepessoa = p.chavevendedor mostra respectivos nomes
quando diferentes não ta mostrando nada ,por causa p.chavepessoa <> p.chavevendedor

entendeu

'-----------------------------------------------------------

tambem tentei assim


QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pe.pessoa_fisica,nome,razao_social) as PESSOA, iif(pe.pessoa_fisica,nome) as VENDEDOR, P.Data AS DATA,"
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P,pessoas as pe "
QSQL = QSQL & "where p.chavepessoa = p.chavevendedor "


se esta duplicando os numeros ex:

teria que aparecer

num doc pessoa vendedor data
10 alexandre carlos 05/10

ok

mas aparece


num doc pessoa vendedor data
---------------------------------------
10 alexandre alexandre 05/10
10 carlos carlos 05/10
--------------------------------------
aparece 2 registros para cada pedido semo inner

#10 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 07 outubro 2009 - 09:44

Ver postvbnet, em 06 outubro 2009 - 17:17 , disse:

e se a chave do vendedor = chave da tabela pessoa mostra o nome do vendedor ententeu a query é entre 2 tabelas pessoas e pedidodevenda


Não, você não entendeu. Você não tem que comparar a chave do vendedor com a chave da tabela pessoa. Você tem que comparar a chave do vendedor com a chave da tabela vendedor.
Não há dados do vendedor na tabela pessoa, e sim na tabela vendedor.
Você precisa trabalhar com três tabelas, e não com duas.

Tente executar a query que te passei direto em seu banco de dados, veja se o resultado será o que você precisa.


VbNet, continuarei te auxiliando, mas movi seu tópico para Access, pois seu problema não é com o VB.

#11 Membro offline   vbnet Ícone

  • Ícone
  • Grupo: Membros
  • Posts: 12
  • Cadastrado: 02-outubro 09

Postou 07 outubro 2009 - 12:07

ok obrigado por ainda me ajudar

cara não tenho a tabela vendedor quando eu cdastro a pessoa eu defino se vai ser pesssoa fisica ou pessoa juridica e se vai ser cliente ou vendedor
porisso da query consultar 2 tabelas tabela pessoa e pedidosdevenda.

essa query so vai funcionar se eu criar a tabela vendedor

sera que tem uma forma via sql para dizer quando chavepessoa = chave então mostra nome da pessoa e se chavevendedor = chave mostra vendedor mas e se a
chavevendedor for <> chavepessoa como eu mostro os nomes do flex grid você acha mais facil separar ou tem como eu fazer assim .

QSQL = "SELECT P.NumDoc AS [Nº DOC], iif(pp.pessoa_fisica,nome,razao_social) as PESSOA, iif(pv.pessoa_fisica,nome,razao_social) as VENDEDOR, P.Data AS DATA,"
QSQL = QSQL & " Format$(p.totalpedido,'###,##0.00') as TOTALPEDIDO, IIF(P.PENDENTE=0,'FECHADO','PENDENTE') AS SITUAÇÃO, P.Chave"
QSQL = QSQL & " FROM PEDIDOSDEVENDA as p, pessoa as pp, vendedor as pv
where p.Chavepessoa = pp.Chave and pv.Chave = p.Chavevendedor "


-------------------------------------------------------------------------------
porque assim não mostra nada

QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave and P.Chavevendedor = Pe.Chave and P.ChavePessoa <> P.Chavevendedor "mas da erro sintaxe sq

ou

QSQL = QSQL & " FROM PEDIDOSDEVENDA AS P INNER JOIN Pessoas pe ON P.ChavePessoa = Pe.Chave and P.Chavevendedor = Pe.Chave where P.ChavePessoa <> P.Chavevendedor "

porque o where não aceia esta condição = P.ChavePessoa <> P.Chavevendedor deveria de mostrar os nomes vendedor e pessoa ok

#12 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 07 outubro 2009 - 18:32

Como assim não tem a tabela vendedor?
Está tudo na mesma tabela? O cadastro dos clientes, dos vendedores? Tudo?

Nossa, ai você se complica sozinho.
Acho que vai precisar desmenbrar sim.
Vou fazer um esquema abaixo que vai te mostrar que sua lógica está errada montando suas tabelas dessa forma:

Tabela PedidosDeVenda:
chave  |  pessoa  |  vendedor  |  valor
1      |    1     |     2      |  R$10,00


Tabela Pessoas
ChavePessoa  |  NomePessoa  |  ChaveVendedor  |  NomeVendedor  |  TipoPessoa (1 p/ vendedor, 0 p/ pessoa)
    1        |     Zé       |                 |                |      0
             |              |       2         |      Fulano    |      1

Quando você faz uma consulta usando o join, a idéia é que ele pegue uma linha de uma tabela e uma linha correspondente da outra tabela. Ou duas e duas, três e três, tanto faz.
Nesse caso, para cada linha da tabela PedidosDeVenda, você precisa de duas linhas da Tabela Pessoa.
Não que isso seja impossível de fazer, mas o retorno não será da maneira como está esperando.
Nunca mostrará assim:
Zé, Fulano, R$10,00

O mais próximo que vai chegar desse resultado será:
Zé, null, R$10,00
null,Fulano, R$10,00

Ou você utiliza tabelas distintas para pessoa e vendedor ou "está na roça".

Boa sorte.

Este post foi editado por Claudio Neto: 07 outubro 2009 - 18:33
Razão por editar:: Adicionado BBcode


#13 Membro online   Claudio Neto Ícone

  • Ícone
  • Grupo: Moderadores
  • Posts: 1624
  • Cadastrado: 07-fevereiro 07
  • Localização:São Paulo, SP

Postou 22 outubro 2009 - 09:03

Vbnet, você não postou mais. Conseguiu resolver? Alterou a estrutura das suas tabelas?
Podemos finalizar o tópico?

Página 1 de 1
  • Novo tópico
  • Responder

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)