Função SQL Server

08/06/2015

0

Pessoal, como faço para tratar uma função do SQL e retornar dados para o PHP?
Guilherme Silva

Guilherme Silva

Responder

Post mais votado

10/06/2015

$query = "create table #turno (CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT)
    insert #turno
    SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')
    select * from #turno
    IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno";

Essas queries não podem ser executadas juntas no PHP !

A função "V_RELOGIO_PONTO", retorna os dados do select que você precisa, mas a última query executada nesse batch ( IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno ), não retorna dados e isso está travando teu código PHP...

Execute, no PHP, apenas... SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE').

Se funcionar, você vai ter de ajustar o uso da temporária ( #turno ), que a principio não tem nada a ver com a função ( V_RELOGIO_PONTO ) !

Marcos P

Marcos P
Responder

Mais Posts

08/06/2015

Marcio Araujo

Maca, me desculpe, não entendi bem sua dúvida.
Responder

09/06/2015

Guilherme Silva

Então Marcio, eu tenho uma função dentro do SQL Server que faz várias consultas de turnos, café, almoço, janta e ceia.. que está assim:
SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')

ela faz vários if's e selects, no caso ai ta consultando tudo que for resumo do cafe da manha... mas nao sei como colocá-la no PHP e trazer os registros entende.. me deram a ideia de usar tabela temporária, até fiz, mas não consigo passar os dados para a array... Nota: a função [dbo].[V_RELOGIO_PONTO] funciona perfeitamente quando jogo no SQL Server.

$query = $DBH->prepare("create table #turno (CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT)
insert #turno
SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')
select * from #turno
IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno");
$query->execute();
$result = $query->fetchAll();
print_r($result);

Hoje eu to usando só o print_r, pq tentei passar para arrays mas nao me retornou nada.. Do jeito que está ai, o chrome me retorna a seguinte resposta: Array ( ).
Eu tinha comentado o print_r, e abaixo da $result eu coloquei assim:
$row = fetch($query);
$cracha = $row['CRACHA_1'];
$nome = $row['FUNCIONARIO']; e as demais colunas... mas ai o chrome mostra: Fatal error: Call to undefined function fetch() in ...

Se eu dou um echo na $query, traz: Catchable fatal error: Object of class PDOStatement could not be converted to string in ... E se eu dou um var dump($DBH) aparece: object(PDO)#1 (0) { }.

A minha dúvida é como fazer o php entender os registros que a função SQL mostra.. Se puder ajudar, agradeço.
Responder

09/06/2015

Marcio Araujo

Maca, me desculpa, mas situação foge do meu conhecimento, vamos aguardar alguem com experiencia no PHP e SQL Server.
Responder

09/06/2015

Guilherme Silva

Ok Marcio obrigado pela atenção!!

Até estou progredindo, estou quase lá.. dei alguns debugs no código assim:
$row = array();
print_r ( $pdo -> errorInfo ( ) ) ; -> esse aqui é o primeiro debug
$pdo -> setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ) ; -> ai depois esse
$res = $pdo->query($query);
//$res->nextRowset();

while($row = $res->fetch(PDO::FETCH_ASSOC)) {
$cracha = $row['CRACHA_1']; e demais variaveis...

Ai retorna assim: Array ( [0] => [1] => [2] => )
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[IMSSP]: The active result for the query contains no fields.' in C:\xampp\htdocs\consulpon\cafe.php:49 Stack trace: #0 C:\xampp\htdocs\consulpon\cafe.php(49): PDOStatement->fetch(2) #1 thrown in C:\xampp\htdocs\consulpon\cafe.php on line 49

Agora eu vi que diz não ter nada nas colunas.. mas tem, pq quando jogo (somente a função) no sql server funciona certinho sem alterar uma vírgula.. Quem puder ajudar agradeço.
Responder

09/06/2015

Marcos P

Sempre que postar código, procure utilizar a tag (Inserir Código ). Isso facilita, em muito, a compreensão do seu código !

Qual o tipo de objeto você criou no Sql Server ?

Poderia colocar aqui o script de criação desse objeto no banco ?

Poderia colocar, ainda, um exemplo da execução disso no Sql Server ? Tanto o comando submetido ao banco, quando ao resultado obtido...
( pode ser uma imagem... )

Esse código fonte em PHP faz acesso a outros objetos do banco de dados ? Uma tabela ou precedure por exemplo ?

Você tentou basear a chamada a essa ( dita ) função, utilizando a mesma estrutura desses eventuais outros comandos ?
( afinal, eles também retornam registros... )
Responder

10/06/2015

Guilherme Silva

Oi Marcos.. Desculpe, vou usar o <code> agora.. Então, no teste que estou fazendo, meu script todo está assim:

<?php 

$myServer = "192.168.0.99";
$myUser = "sa";
$myPass = "sa";
$myDB = "vetorh_ponto"; 

try {
  # MS SQL Server and Sybase with PDO_DBLIB
  $pdo = new PDO("sqlsrv:server=$myServer;database=$myDB", $myUser, $myPass);

if( $pdo ) {
     echo "";
}else{
     echo "Nao conectou.<br />";
     die( print_r( sqlsrv_errors(), true));
}

}
catch(PDOException $e) {
    echo $e->getMessage();
}


$query = "create table #turno (CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT)
	insert #turno
	SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')
	select * from #turno
	IF OBJECT_ID('tempdb..#turno') IS NOT NULL DROP TABLE #turno";
	$row = array();
	print_r ( $pdo -> errorInfo ( ) ) ; 
	$pdo -> setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ) ; 
	$res = $pdo->query($query);
	//$res->nextRowset();
	
	while($row = $res->fetch(PDO::FETCH_ASSOC)) {
		$cracha = $row['CRACHA_1']; // e demais colunas .....
	}
	echo $cracha; // e demais colunas ......
	
	//echo $query;
	//var_dump($pdo);
?>


No Sql Server, eu só rodo esse comando dentro da variavel $query, e ele traz os registros conforme a imagem abaixo:

[img]http://arquivo.devmedia.com.br/forum/imagem/434904-20150610-081436.png[/img]

E esse código faz acesso a várias tabelas a partir dessa função [dbo].[V_RELOGIO_PONTO], de dois bancos diferentes.. Mas acho que "bancos diferentes" nao vem ao caso, só preciso fazer o PHP entender essa função e retornar os registros.. Mexi mais um pouco ontem, e do jeito que está ai, me retorna a seguinte mensagem:
Array ( [0] => 01000 [1] => 5701 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Changed database context to 'vetorh_ponto'. ) 
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[IMSSP]: The active result for the query contains no fields.' in C:\xampp\htdocs\consulpon\cafe.php:49 Stack trace: #0 C:\xampp\htdocs\consulpon\cafe.php(49): PDOStatement->fetch(2) #1  thrown in C:\xampp\htdocs\consulpon\cafe.php on line 49


O que acha que pode ser Marcos?
Responder

10/06/2015

Marcos P

Qual tipo de objeto é V_RELOGIO_PONTO no Sql Server ?

Consegue postar o script de criação desse objeto no banco ?

Qual a relação desse objeto e a temporária #turno e por que você populou essa tabela na mesma query que evocou V_RELOGIO_PONTO ?

As autorizações de acesso a esses objetos, tanto para execução de V_RELOGIO_PONTO, como para criação e manipulação de #turno, estão liberadas para o usuário de banco que você usa para conectar pelo PHP ?

A temporária #turno, pode ser substituída por uma tabela permanente ( mesmo que seja apenas para finas de teste ) ?

Essas instruções precisam ser geradas todas juntas, principalmente do lado do PHP ?

Você consegue gerar uma-a-uma, identificando o ponto exato em que ocorre o problema ?

Outras funções nativas do banco, você consegue acessar no PHP ? Por exemplo :

select getdate()
Responder

10/06/2015

Guilherme Silva

Marcos, vamos lá.. Na verdade não manjo muito sobre objetos e demais coisas no SQL Server.. Essa função v.relogio_ponto foi um outro rapaz que fez, mas enfim.. só pra você saber..
Se com objeto você diz ser a função completa do SQL, aqui vai:

USE [vetorh_ponto]
GO
/****** Object:  UserDefinedFunction [dbo].[V_RELOGIO_PONTO]    Script Date: 06/08/2015 15:49:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[V_RELOGIO_PONTO] (@TIPO CHAR(7))
returns @TABELA table
( CRACHA_1 INT, FUNCIONARIO VARCHAR(40), SETOR VARCHAR(60), DATA_ACESSO DATETIME, HORA_ACESSO time, 
  CATRACA varchar(60), CODIGO_EVENTO smallint, NOME_EVENTO VARCHAR(20), TOTAL INT                   )
AS
BEGIN
	DECLARE @CAFE_INI int, @CAFE_FIM int,
			@ALMOCO_INI int, @ALMOCO_FIM int,
			@JANTAR_INI int, @JANTAR_FIM int,
			@CEIA_INI int, @CEIA_FIM int,
			@INICIO DATETIME, @FIM DATETIME

	SET @CAFE_INI   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CAFE_INI') 
	SET @CAFE_FIM   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CAFE_FIM')
	SET @ALMOCO_INI = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_ALMOCO_INI')
	SET @ALMOCO_FIM = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_ALMOCO_FIM')
	SET @JANTAR_INI = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_JANTAR_INI')
	SET @JANTAR_FIM = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_JANTAR_FIM')
	SET @CEIA_INI   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CEIA_INI')
	SET @CEIA_FIM   = (SELECT CAST(cnf_valor as INT) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_CEIA_FIM')
	SET @INICIO = (SELECT CAST(cnf_valor AS datetime) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_DATA_INI') 
	SET @FIM    = (SELECT CAST(cnf_valor AS datetime) FROM AIS.APIS.DBO.T_CONFIG WHERE CNF_CAMPO = 'VETOR_DATA_FIM')


if @tipo = 'CAFE'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CAFE_INI and @CAFE_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RCAFE'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CAFE_INI and @CAFE_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) A GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1


if @tipo = 'ALMOCO'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @ALMOCO_INI and @ALMOCO_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RALMOCO'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @ALMOCO_INI and @ALMOCO_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) B GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1



if @tipo = 'JANTAR'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @JANTAR_INI and @JANTAR_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RJANTAR'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @JANTAR_INI and @JANTAR_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) C GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1


if @tipo = 'CEIA'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[DATA_ACESSO],[HORA_ACESSO],[CATRACA],[CODIGO_EVENTO],[NOME_EVENTO])
	SELECT r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
	FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
	(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CEIA_INI and @CEIA_FIM)
	AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC


if @tipo = 'RCEIA'
	INSERT @TABELA ([CRACHA_1],[FUNCIONARIO],[SETOR],[CODIGO_EVENTO],[NOME_EVENTO], [TOTAL])
	select CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO, COUNT(*) AS QTD from
	(	SELECT TOP 100000 r038hch.numcad 'CRACHÁ_1', r034fun.nomfun 'FUNCIONARIO',r016orn.nomloc 'SETOR',r070acc.datacc 'DATA_ACESSO', right((convert(char(8), dateadd(second, r070acc.horacc, ''), 114)),5) 'HORA_ACESSO', r058rlg.desrlg 'CATRACA',r070acc.tipacc 'CODIGO_EVENTO',r070tac.desred 'NOME_EVENTO'
		FROM r070acc,r034fun,r070tac,r058rlg,r038hch,r038hlo,r016orn,r030emp WHERE r070acc.codplt = r058rlg.codplt AND r070acc.codrlg = r058rlg.codrlg AND r070tac.tipacc = r070acc.tipacc AND r034fun.numemp = r030emp.numemp AND r038hch.numemp = r030emp.numemp AND r038hlo.numemp = r030emp.numemp AND r038hlo.taborg = r016orn.taborg AND r038hlo.numloc = r016orn.numloc AND
		(r070acc.datacc between @INICIO and @FIM AND r070acc.horacc between @CEIA_INI and @CEIA_FIM)
		AND r038hch.numcra = r070acc.numcra AND (r038hch.datini < r070acc.datacc OR (r038hch.datini = r070acc.datacc AND r038hch.horini <= r070acc.horacc)) AND (r038hch.datfim = CONVERT(DATETIME,'1900/12/31',111) OR r038hch.datfim > r070acc.datacc OR (r038hch.datfim = r070acc.datacc AND r038hch.horfim >= r070acc.horacc)) AND r034fun.numemp = r038hch.numemp AND r034fun.tipcol = r038hch.tipcol AND r034fun.numcad = r038hch.numcad AND r034fun.numemp = r038hlo.numemp AND r034fun.tipcol = r038hlo.tipcol AND r034fun.numcad = r038hlo.numcad AND r038hlo.datalt = (SELECT MAX(datalt) FROM r038hlo a WHERE a.numemp = r034fun.numemp AND a.tipcol = r034fun.tipcol AND a.numcad = r034fun.numcad AND a.datalt <= r070acc.datacc) AND 0 = 0 ORDER BY 1 ASC,2 ASC,4 ASC
	) D GROUP BY CRACHÁ_1, FUNCIONARIO, SETOR, CODIGO_EVENTO, NOME_EVENTO ORDER BY 1

RETURN

END



As alterações devem estar liberadas, creio eu, pois estou com o usuário 'sa'.. essa temporária #turno, fiz pois um amigo me indicou procurar sobre tabelas temporárias para trabalhar com essa função, e então hoje está assim o código.. Sim, para teste podemos também migrar para uma tabela permanente esses dados.. Não sei te dizer se todas as instruções precisam estar juntas pois comecei com o PDO agora.. Por isso tenho ainda essas dúvidas

Não cheguei a testar separado

Sim, o getdate funcionou.
Usei
print_r(getdate());

Que trouxe
Array ( [seconds] => 20 [minutes] => 44 [hours] => 16 [mday] => 10 [wday] => 3 [mon] => 6 [year] => 2015 [yday] => 160 [weekday] => Wednesday [month] => June [0] => 1433947460 )
Responder

10/06/2015

Guilherme Silva

Marcos, não sei se é exatamente o que você disse.. Eu executei assim:
try {
  # MS SQL Server and Sybase with PDO_DBLIB
	$pdo = new PDO("sqlsrv:server=$myServer;database=$myDB", $myUser, $myPass);
	if( $pdo ) {
		 echo "";
	}else{
		 echo "Connection could not be established.<br />";
		 die( print_r( sqlsrv_errors(), true));
	}

$query = "SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('RCAFE')";
     print_r ($pdo -> errorInfo()); 
    $res = $pdo->query($query);
    echo $res;
		
}catch(PDOException $e) {
	echo $e->getMessage();
}

Mas meu retorno foi esse:
Array ( [0] => 01000 [1] => 5701 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Changed database context to 'vetorh_ponto'. ) 
Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\xampp\htdocs\consulpon\cafe.php on line 20

Precisava ver primeiro como fazer trazer os dados nessa array para posteriormente se for o caso, jogar em tabela temporária.. Na verdade o erro possivelmente pode estar nas linhas abaixo da query, como nesse $pdo->query($query) ou o echo $res, os quais eu não sei dizer se estão corretos..
Responder

10/06/2015

Marcos P

Valide o tipo de todas as colunas retornadas pela função e a declaração de seu array, pois parece que está ocorrendo conflito de tipo ( Object of class PDOStatement could not be converted to string ).

Sua ideia é jogar os dados em uma temporária... porque você não faz isso dentro da própria função, retornando os dados em uma tabela fixa, com identificação do usuário que rodou a query ?
( para você pode isolar os dados corretos, na sessão corrente do PHP )

Tenho vários códigos PHP que carregam arrays com queries do Sql Server e, estando todos os tipos certos, nunca tive maiores problemas...
( no exemplo abaixo, a carga de uma grid com vários registros )

$SQL = "select NroFatura,convert(char,Vencimento) as Vencimento, convert(char,VencBloq) as VencBloq from faturas where codcliente = ".$_SESSION["codcli"]." and StatusBaixa = 'A' and tipodoc = 1 and VencBloq is not null order by Vencimento desc";			

$result = mssql_query($SQL);
  
if (!$result) {
     echo "<script> alert('Erro ao selecionar faturas!');</script>";
     $url = "logout.php";
     $delay = "0";
     echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'">';
     exit;
}

$total = mssql_num_rows($result);		

if ($total > 0){

echo "<tr>".
"<td colspan=\"5\" rowspan=\"1\" align=\"left\" style=\"height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Faturas em Aberto com 2.a Via Emitida</font></td>".
"</tr>".
"<tr>".
"<td style=\"width: 80px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Nº Fatura</font></td>".
"<td style=\"width: 130px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Venc. Original</font></td>".
"<td style=\"width: 130px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Venc. 2.Via</font></td>".
"<td style=\"width: 130px; height: 8px; background-color: rgb(170,170,170); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\">Valor 2.Via</font></td>".
"<td style=\"width: 120px; height: 8px; background-color: rgb(255, 255, 255); color: rgb(255, 255, 255); font-family: Arial; font-weight: bold;\" ><font size=\"2\"></font></td>".
"</tr>";

while($dados = mssql_fetch_array($result))
{
	selDados($dados["NroFatura"]);
	echo "<tr style\"background-color: rgb(255, 255, 255);\">";
	$auxstr = "<td style=\"width: 80px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">".$dados["NroFatura"]."</font></td>";
  echo $auxstr;
	$auxstr = "<td style=\"width: 130px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">".$dataant."</font></td>";
  echo $auxstr;
  $auxstr = "<td style=\"width: 130px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">" .$vencbloq. "</font></td>";
  echo $auxstr;
  $auxstr = "<td style=\"width: 130px; height: 8px; background-color:#CCCCCC;\" ><font size=\"2\">" .$valorant. "</font></td>";
  echo $auxstr;
  $auxstr = "<td style=\"width: 120px; height: 8px; background-color:rgb(255, 255, 255);\" ><font size=\"2\"><input style=\"width: 80px;\" class=botao name=\"".$dados["NroFatura"]."\" value=\"Reimprimir\" type=\"button\" onclick=\"emitir(this.name,'{$vencbloq}');\"></font></td>";
  echo $auxstr;  
  
  echo "</tr>";
}
Responder

10/06/2015

Guilherme Silva

Legal Marcos.. Vou testar hoje quando tiver um tempo e amanhã escrevo aqui sobre os retornos.. Muito obrigado pela atenção até agora.. Até amanhã o/
Responder

11/06/2015

Guilherme Silva

Prezados, bom dia!

Fiz algumas mudanças no código e consegui parcialmente o que queria! Segue o código modificado abaixo:

<?php 
include "conn.php";

	$sql = "SELECT * FROM [dbo].[V_RELOGIO_PONTO] ('CAFE')";
    $stmt = sqlsrv_query( $conn, $sql );
	if( $stmt === false) {
		die( print_r( sqlsrv_errors(), true) );
	}
	while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
		$id = $row["CRACHA_1"];
		$nome = $row["FUNCIONARIO"];
		$setor = $row["SETOR"];
		$cevento = $row["CODIGO_EVENTO"];
		$evento = $row["NOME_EVENTO"];
		$total = $row["TOTAL"];
		
		echo $id;
		echo $nome;
		echo $setor;
		echo $cevento;
		echo $evento;
		echo $total."<br>";
	}
?>


Está bem crú em tela, mas traz todos os registros de acordo com o que peço na função, se é CAFE, RCAFE, ALMOCO, JANTA, CEIA... Enfim..
Marcos, sabe me dizer se do jeito que fiz, se esse sqlsrv_query está ultrapassado?
Eu cansei de usar o PDO porque se mudava uma vírgula, mudava o retorno --' , seja string, contexto do banco, ou Array ( [0] => 01000 [1] => 5701 [2]... ai cada hora eu ficava procurando no google sobre algum erro, e só ficava dando voltas..
Responder

11/06/2015

Marcos P

Se funciona... não está ultrapassado !

Mas existem outros métodos de acesso a dados no Sql Server, via PHP... é questão de pesquisar.
Responder

11/06/2015

Guilherme Silva

Entendi.. É que por exemplo, se você usar o mysql_query no XAMPP, roda normal.. Se você usar no WAMP, ele diz que está ultrapassado, e que deve ser usado o mysqli_query entende.. Assim, só pra saber mesmo, se continuará funcionando daqui um tempo..

Mas beleza, depois vou até testar usando o mssql_query igual você, pelo visto esse também traz os dados normalmente..
Marcos, muito obrigado pela ajuda! Primeira vez que pergunto em um fórum e foi de grande valia!

Pra quem tiver esse problema, mais um caso de "Resolvido"... Abraços!
Responder

11/06/2015

Marcos P

Toda ajuda é bem vinda !

Se você puder continuar por aqui, participando... seria legal !

T+
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar