[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Хранимая процедура mssql
lexa322
есть база на mssql там есть хранимая процедура которая собирает данные из разных таблиц. эта процедура имеет несколько параметров:
@ncard //номер карты
выходные параметры
@dsc //скидка
@SumN //сумма скидки
@sum //сумма которую следует набрать до следующий скидки
@dscn //следующая скидка
надо сделать так чтобы человек вводя номер карты в форму по нажатию кнопки или что другое видел свою скидку. к базе все нормально подключился, к самой процедуре тоже, но когда проверяю номер карты все выдается по нулям либо что такой карты нет, хотя она есть. как правильно поставить условие???
пример скрипта:
<?php
echo
'<form action=index.php method=post>
Номер карты : <input type="text" name="nomer"><br>
<input name=user_nomer type=submit value="Отправить данные">
</form>';

$conn=mssql_connect($host,$username,$password);

if ($conn)
{

$qwe=$_POST['nomer'];
mssql_select_db($name,$conn);
$stmt=mssql_init('getDSC',$conn);
mssql_bind($stmt,'@ncard',$nom,SQLVARCHAR);
mssql_bind($stmt,'@dsc',$sk,SQLFLT8,true); //скидка
mssql_bind($stmt,'@SumN',$sk1,SQLFLT8,true); //сумма скидки
mssql_bind($stmt,'@sum',$summa,SQLFLT8,true); //сумма которую следует набрать до следующий скидки
mssql_bind($stmt,'@dscn',$su,SQLFLT8,true); //следующая скидка
$result=mssql_execute($stmt) or die("ошибка вставки в базу данных");
if ($sk == $_post['nomer'])
{
echo $sk; echo'<br>';
echo $summa; echo'<br>';
echo $su; echo'<br>';
}
else echo 'номер карты не найден';
//mssql_close($conn);
}
else print("ooops!");

?>






Спустя 19 минут, 5 секунд (29.07.2009 - 13:34) Dezigo написал(а):
PHP
$result=mssql_execute($stmt) or die("ошибка вставки в базу данных");
if ($sk == $_post['nomer'])
{
echo $sk; echo'<br>';
echo $summa; echo'<br>';
echo $su; echo'<br>';
}

это что такое $sk?
делай так:

PHP
mssql_select_db($name,$conn);
$stmt=mssql_init('getDSC',$conn);
mssql_bind($stmt,'@ncard',$nom,SQLVARCHAR);
mssql_bind($stmt,'@dsc',$sk,SQLFLT8,true); //скидка
mssql_bind($stmt,'@SumN',$sk1,SQLFLT8,true); //сумма скидки
mssql_bind($stmt,'@sum',$summa,SQLFLT8,true); //сумма которую следует набрать до следующий скидки
mssql_bind($stmt,'@dscn',$su,SQLFLT8,true); //следующая скидка

$result=mssql_execute($stmt) or die("ошибка вставки в базу данных");

$posts = mssql_num_rows($result);
if(
$posts > 0)
{
    while($row = mssql_fetch_array($result) 
  
{
      echo "сдесь вывод $row[''], либо условаие if() {}";
  }
                   
    
}

лучше покажи процедуру.

Спустя 10 минут, 53 секунды (29.07.2009 - 13:44) lexa322 написал(а):
там ее программист создавал, он уверяет что она рабочая
-------------------------------------------
ALTER PROCEDURE GetDSC
@NCard varchar(6), -- карта
@Sum float output, -- набранная сумма
@DSC float output, -- текущая скидка
@SumN float output, -- сумма необх. для след. скидки
@DSCN float output -- след. скидка
As
Begin
Declare @ncs int, @nm float, @krs float, @dcs float

Declare SumS CURSOR For
Select isNull(Sum(I.SumR),0) as SumS
From Invoice I,Firm F
Where I.F in (1,2,3,4,5,6,10,11,12,13,14,16,17,18) and I.Cust=F.Cntr and F.DSC=@NCard and I.bg=0
Union
Select isNull(Sum(-I.SumR),0) as SumS
From Invoice I,Firm F
Where I.F in (-10,-11,-12,-13,-17) and I.Cust=F.Cntr and F.DSC=@NCard and I.bg=0

Open SumS
Fetch Next From SumS Into @nm
Set @Sum=isNull(@nm,0)
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM SumS Into @nm
If @@FETCH_STATUS = 0 Set @Sum=@Sum+isNull(@nm,0)
END

Set @ncs=Convert(int,@Ncard)
Declare PRLS CURSOR For
Select KRS,DCS from PrRules
Where Lb=1 and Tg=1 and (TgD=0 or (TgD=1 and Dat1<=GETDATE() and Dat2>=GETDATE())) and
TgF=3 and @ncs>=NCard1 and @ncs<=NCard2
Order by Np,Cod
Open PRLS
Fetch Next From PRLS Into @krs, @dcs
IF @Sum>=@krs BEGIN Set @DSC=@dcs Set @SumN=0 Set @DSCN=0 END
ELSE BEGIN
WHILE @@FETCH_STATUS = 0
BEGIN
Set @SumN=@Krs-@nm
Set @DSCN=@dcs
FETCH NEXT FROM PRLS Into @krs, @dcs
If @Sum>=@krs
BEGIN
Set @DSC=@dcs
BREAK
END
END
END
CLOSE PRLS
DEALLOCATE PRLS
CLOSE SumS
DEALLOCATE SumS

end
-------------------------------------------------------------------
sk это сама скидка, там я попутал другое должно быть написано.....

Спустя 15 минут, 3 секунды (29.07.2009 - 13:59) Dezigo написал(а):
проверь процедуру саму на сервере mssql.
правой кнопкой - execute.
если она тебе выведет параметры,то ок.
так проверил процедуру, синтакс. ошибок нету. smile.gif

ты не весь код скинул параметров,.
процедура возврощает объект - его преобразуй в ассоцииативный массив.
а дальше работа уже с самим массивом.

как написана процедура ,так она и работает.

код я тебе написал выше.
проверяй.

Спустя 15 часов, 17 секунд (30.07.2009 - 05:00) lexa322 написал(а):
А вот если для дурака, как это правильно можна реализовать? тол уже не чего не понимаю, а надо сделать....

Спустя 27 минут, 39 секунд (30.07.2009 - 05:27) lexa322 написал(а):
Ошибку выдает: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource

Спустя 2 часа, 43 минуты, 51 секунда (30.07.2009 - 08:11) Dezigo написал(а):
напиши это -
PHP
$stmt=mssql_init('getDSC',$conn);
mssql_bind($stmt,'@ncard',$nom,SQLVARCHAR) or die('Mssql init -  error');
mssql_bind($stmt,'@dsc',$sk,SQLFLT8,true) or die('mssql bind');
mssql_bind($stmt,'@SumN',$sk1,SQLFLT8,true) or die('mssql bind'); 
mssql_bind($stmt,'@sum',$summa,SQLFLT8,true) or die('mssql bind'); 
mssql_bind($stmt,'@dscn',$su,SQLFLT8,true) or die('mssql bind');

$result=mssql_execute($stmt) or die("ошибка вставки в базу данных");

сдесь везде я поставил or die();
если ошибки не будет,то следущий этап вывода.

Спустя 17 минут, 15 секунд (30.07.2009 - 08:29) lexa322 написал(а):
тоже самое пишет: Warning: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource in
переменая $stmt она возвращает: Resource id #3
Понимаешь тот кто эту процедуру создавал говорил что эта процедура просто выводит выходные параметры если введен номер карты которая есть в базе. эта процедура не создает ни какой таблицы куда заносятся данные, поэтому наверно так она и ругается. он говорил что типо ты должен обратится к параметру ncard и если карта есть то он все выведет. на первоначальном этапе когда он только создавал процедуру он сделал заглушку, т.е. вводишь любой номер карты он тебе выводит одну и туже скидку, у меня все работало а щас не чего не получается...

Спустя 38 минут, 49 секунд (30.07.2009 - 09:07) lexa322 написал(а):
Когда явно присваиваю номер карты $nom = 250724, то он выводит скидку. может что то из формы не передается? что посоветуете?

Спустя 7 минут, 12 секунд (30.07.2009 - 09:15) Dezigo написал(а):
$stmt она возвращает: Resource id #3
всё правельно вывел.
сдеалай так:
PHP
$result=mssql_execute($stmt) or die("ошибка вставки в базу данных");


 while(
$row mssql_fetch_array($result
  {
     echo 
$row[0].$row[1]; // сколько сдесь выходных параметров
  
}


не имеет значение,либо ты записываешь или выводишь - главное возвратный результат - либо true или false.или вывод данных.
всё это можно обработать.



Спустя 2 минуты, 17 секунд (30.07.2009 - 09:17) Dezigo написал(а):
скинь сюда полностю код. а не куски.
откуда мне знать,как ты сделал?
насчёт параметров, - это ты должен был сделать сначало.(проверить), а не кидаться сразу на процедуру.

Спустя 16 минут, 31 секунда (30.07.2009 - 09:33) lexa322 написал(а):
Все получилось, нашел выход. тема закрыта.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.