powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
13 сообщений из 13, страница 1 из 1
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35922024
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ХП zpsp_BolnList2009, которая производит расчет начислений и калелендарных дней для рассчета среднедневной зарплаты по больничному. Она возвращает данные за последний год до начала больничного.
Вчера столкнулся с ситуацией, когда recordset возвратил не 12 записей, а десять, в то время как в Query Analyzer процедура возвратила все 12 записей. Это проявилось только в одном случае из 10 тестов с разными исходными данными. В чем может быть проблема? Может быть, кто-нибудь сталкивался с подобным?

Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL = "EXEC zpsp_BolnList2009_log " & Tn & ", '" & Format(date_beg, "mm/dd/yyyy") & _
    "', '" & Format(Date_End, "mm/dd/yyyy") & "'"
If txtBolnF = "" Then
    SQL = SQL & ", 0, 0"
Else
    SQL = SQL & ", 1, " & txtBolnF
End If
    
rdoErrors.Clear
Set pr_Rcs = pc_SqlConn.OpenResultset(SQL, rdOpenKeyset, rdConcurReadOnly, rdExecDirect)

Готов ответить на уточняющие вопросы. Заранее спасибо.
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35922411
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без исходных данных и текста хп ничего посоветовать невозможно.
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35922843
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,
Хранимку и исходные данные я могу предоставить, но к ним еще семь таблиц...
Я не думаю, что у кого-нибудь будет желание с этим возиться...
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35922861
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вот думаю, может параметры recordseta как-то влияют?
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35923195
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
записей не хватало в конце или в середине?

и ИМХО лучше дату передавать в стандарте YYYYMMDD
чтобы быть полностью уверенным, что дата правильно распознается


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35923281
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, Период с марта 2007 по февраль 2008, пропали апрель и декабрь
Формат даты менять пробовал, результат тот же
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35924048
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда без кода ХП ничего сказать нельзя
плюс желательно посмотреть строку сформированного запроса
т.е
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL = "EXEC zpsp_BolnList2009_log " & Tn & ", '" & Format(date_beg, "mm/dd/yyyy") & _
    "', '" & Format(Date_End, "mm/dd/yyyy") & "'"
If txtBolnF = "" Then
    SQL = SQL & ", 0, 0"
Else
    SQL = SQL & ", 1, " & txtBolnF
End If

Debug.Print SQL 
I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35924117
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,
Debug.Print SQL возвращает:
Код: plaintext
EXEC zpsp_BolnList2009  3641 , ' 03 . 24 . 2009 ', ' 03 . 30 . 2009 ',  0 ,  0 
Сорри, в передыдущем ответе я не правильно описал диапазон - с марта 2008 по февраль 2009
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35924147
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код ХП:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
CREATE  PROC zpsp_BolnList2009
        @tn smallint,
	@date_beg smalldatetime ,   -- дата начала больничного
	@date_end smalldatetime,    -- дата окончания
	@tip bit,                   --  0 -первичный лист,  1 -продолжение листа
	@N_osn int              -- N первичного листа, если @tip= 1 
AS  
SET NOCOUNT ON
--PRINT '  Расчет больничного листа  '
-- версия от  20 . 03 . 2009   14 : 45  
--BEGIN TRANSACTION
DECLARE
        @zpl_mes tinyint ,
        @zpl_year smallint ,
        @i tinyint,
        @datavid smalldatetime,
        @nomerbl varchar( 20 ),
        @tmp_mes tinyint ,
        @tmp_year smallint ,
      @date_beg_cont smalldatetime 

SELECT @zpl_mes=value FROM zptb_minzpl WHERE id='month' AND name=USER_NAME()
SELECT @zpl_year=value FROM zptb_minzpl WHERE id='year' AND name=USER_NAME()
IF @zpl_mes IS NOT NULL AND @zpl_year IS NOT NULL
BEGIN
CREATE TABLE #Tmp(
	Fio varchar( 40 ) NULL , 
	Zpl real null ,              -- Оклад или ставка
	Shifr smallint NULL ,        -- Шифр оклада 
	TipPremii varchar( 3 ) NULL ,  -- Тип премии
	NeprStag real NULL ,         -- Непрерывный стаж работы
	Mes int NULL ,               -- Месяц
	Year int NULL ,               -- Год
	Day smallint NULL ,          -- Количесво отработанных дней
	DayKal smallint NULL ,          -- Количесво дней в месяце
	Summa money NULL ,           -- Сумма
        Prem money NULL ,            -- Премия 
	PremMes money NULL ,         -- Премия с разбивкой по месяцам
	Rr int NULL ,                -- режим работы
	Smena char( 1 ) NULL )              -- смена
IF @tip= 1   -- продолжение больничного листка
   BEGIN
	SELECT @date_beg_cont=@date_beg
--ищем первичный больничный лист и дату его начала
--вставили case т.к. в zptb_nachisl note в дате нач. больничного год в разном формате 
	SELECT @date_beg=ISNULL(MIN(CONVERT(smalldatetime,
     (case
            when SUBSTRING(note, patindex('%[сСcC]___[./-,]%__[./-,]%__[./-,]%', note)+10, 1)= ' ' then 
                 SUBSTRING(note, patindex('%[сСcC]___[./-,]%__[./-,]%__[./-,]%', note)+2, 8 ) 
        else  SUBSTRING(note, patindex('%[сСcC]___[./-,]%__[./-,]%__[./-,]%', note)+2, 10 ) end),
      case when SUBSTRING(note, patindex('%[сСcC]___[./-,]%__[./-,]%__[./-,]%', note)+10, 1)= ' ' then 4 else 104 end )),@date_beg)
               from zptb_nachisl where tn=@tn and shifr in ( 115 ,  116 ,  125 , 143 , 144 ) 
                         and note LIKE '%'+CONVERT(varchar(10), @N_osn)+'%'
	IF @date_beg_cont=@date_beg  
		PRINT 'Не найден первичный листок или неверно указаны даты !'
   END
/* Больничный расчитывается за  12  месяцев перед болезнью за календарные дни.
   В расчет включается : оклад, сдельно, ночные, бригадирские, тек.простои, постоянные совмещения, премия, средний  и ученические
*/
   BEGIN
--	Вычисляем первый и последний день периода расчета количества календарных дней и начислений
	DECLARE @cnt_mes int
	DECLARE @firstdate datetime
	DECLARE @lastdate datetime
	SELECT  @cnt_mes= 1 
	SELECT @lastdate=DATEADD(month, 0 ,DATEADD(day, 1 -day(@date_beg),@date_beg))- 1 
	SELECT @cnt_mes= 12 
	SELECT @firstdate=CAST('01.'+ CAST(DATEPART(mm, DATEADD(mm, -@cnt_mes, @date_beg)) AS CHAR(2))+ '.' +CAST( DATEPART(yy, DATEADD(mm, -@cnt_mes, @date_beg)) AS CHAR(4))  AS DATETIME)
	SELECT  @cnt_mes= 1 
--	Устанавливаем выходные в период отпусков в символ отпуска по таблице kdtb_otpusk
	CREATE TABLE #tmp2 (kod_otp char( 1 ), tn smallint, datebeg datetime, dateend datetime)
	INSERT #tmp2 (kod_otp, tn, datebeg, dateend)
	SELECT kod_otp, tn, data_beg, data_end
	FROM kdtb_otpusk WHERE tn=@tn AND ((data_beg BETWEEN @firstdate AND @lastdate) OR (data_end BETWEEN @firstdate AND @lastdate))
	INSERT #tmp2 (kod_otp, tn, datebeg, dateend)
	SELECT kod_otp, tn, data_beg_prod, data_end_prod
	FROM kdtb_otpusk WHERE tn=@tn AND data_beg_prod BETWEEN @firstdate AND @lastdate
	CREATE TABLE #tmp3 (tn smallint, p char( 2 ), date smalldatetime)
	CREATE TABLE #tmp5 (tn smallint, p char( 2 ), date smalldatetime)
	INSERT #tmp3 SELECT DISTINCT tn, '1', date FROM tutb_tabelall WHERE tutb_tabelall.tn=@tn -- все дни ставим как работу в первую смену для того, чтобы избежать двойных записей при двух записях за один день в табеле, 09.10.2008
	UPDATE #tmp3 SET p=#tmp2.kod_otp FROM #tmp2, #tmp3 WHERE #tmp3.date BETWEEN #tmp2.datebeg AND #tmp2.dateend AND #tmp2.tn=#tmp3.tn
	INSERT #tmp5 SELECT DISTINCT tn, p, date FROM tutb_tabelall WHERE tutb_tabelall.tn=@tn
	UPDATE #tmp5 SET p=#tmp2.kod_otp FROM #tmp2, #tmp5 WHERE #tmp5.date BETWEEN #tmp2.datebeg AND #tmp2.dateend AND #tmp2.tn=#tmp5.tn
--	Устанавливаем выходные в период болезни в 'Б' по таблице kdtb_boln
	CREATE TABLE #tmp6 (tn smallint, datebeg datetime, dateend datetime)
	INSERT #tmp6 (tn, datebeg, dateend)
	SELECT tn, s, po
	FROM kdtb_boln WHERE tn=@tn AND ((s BETWEEN @firstdate AND @lastdate) OR (po BETWEEN @firstdate AND @lastdate))
	UPDATE #tmp3 SET p='Б' FROM #tmp6, #tmp3 WHERE #tmp3.date BETWEEN #tmp6.datebeg AND #tmp6.dateend AND #tmp3.tn=#tmp6.tn
-- 	расчет количества календарных дней за  12  предыдущих месяцев
	CREATE TABLE #tmp4 (day tinyint, tn smallint, mes tinyint, year smallint)
	INSERT #tmp4(day, tn, mes, year)
	SELECT  COUNT(*), tn, month(date), year(date) FROM #tmp3
	WHERE tn=@tn 
	AND date BETWEEN @firstdate AND @lastdate
	AND p NOT IN ('Б','О','А','У','Р','Д','Е','Я')  GROUP BY tn, month(date), year(date)
--select * from #tmp4
-- 	расчет начислений за  12  предыдущих месяцев
WHILE @cnt_mes<= 12 
  BEGIN
	INSERT #Tmp( Day, Summa, Prem, mes, year)
--	     SELECT SUM(CASE WHEN shifr IN ( 100 ,  101 ,  102 ,  113 ,  120 ,  108 ,  139 ) THEN day ELSE  0  END), - старый вариант, использовался при расчете по рабочим дням
	     SELECT CASE WHEN #tmp4.day= 0  THEN  0  ELSE #tmp4.day END,
	          SUM(zptb_nachisl.Summa),  0 , zptb_nachisl.mes, zptb_nachisl.year
		FROM zptb_nachisl, #tmp4 WHERE zptb_nachisl.tn=@tn AND #tmp4.tn=zptb_nachisl.tn AND 
	       		(zptb_nachisl.shifr NOT IN ( 5 ,  15 ,  106 ,  109 ,  110 ,  112 ,  114 ,  115 ,  116 ,  117 ,  118 ,  119 ,  125 ,  135 ,  137 ,  138 ,  140 ,  143 ,  144 ) AND
		             zptb_nachisl.shifr< 500 ) AND
			zptb_nachisl.year=DATEPART(yy, DATEADD(mm, -@cnt_mes, @date_beg)) AND
			zptb_nachisl.mes=DATEPART(mm, DATEADD(mm, -@cnt_mes, @date_beg)) AND #tmp4.year=zptb_nachisl.year AND #tmp4.mes=zptb_nachisl.mes
		GROUP BY zptb_nachisl.year, zptb_nachisl.mes, #tmp4.day 
	   SELECT @cnt_mes=@cnt_mes+ 1 
  END
UPDATE #Tmp SET zpl=zptb_schet.zpl, shifr=zptb_schet.shifr, tipPremii='Fzp' FROM zptb_schet 
		WHERE tn=@tn AND date_end is null

   END
IF @tip= 1 
	SELECT @date_beg=@date_beg_cont
-- ЗАМЕНЕН РАСЧЕТ СТАЖА НЕПРЕРЫВНОГО НА ОБЩИЙ СТРАХОВОЙ

UPDATE #Tmp SET Fio=LTRIM(sr_fam)+' '+sr_io,
 --NeprStag=CONVERT(real,DATEDIFF(mm, sr_nepst,@date_beg  ))/ 12 ,
NeprStag =(CONVERT(real,DATEDIFF(mm, sr_datapr,@date_beg  ))+(CONVERT(real,(sr_ost_let* 12 +sr_ost_mes))))/ 12 ,
		 Rr=sr_nomrr, smena=sr_smn
	 FROM spr_ml151 WHERE sr_sys=@tn
END


SELECT * FROM #Tmp ORDER BY year, mes
GO
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35925289
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мдя, жестока ХП
предлагаю сделать такое усовершенствование в ХП

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE #Tmp(cnt_mes int, ...
...
...
...

insert #tmp( cnt_mes, day, summa, prem, mes, year)
select 
  @cnt_mes,
  case when #tmp4.day= 0  then  0  else #tmp4.day end,
	sum(zptb_nachisl.summa),  0 , zptb_nachisl.mes, zptb_nachisl.year
from 
  zptb_nachisl, #tmp4 
where 
  zptb_nachisl.tn=@tn and #tmp4.tn=zptb_nachisl.tn and 
	(zptb_nachisl.shifr not in ( 5 ,  15 ,  106 ,  109 ,  110 ,  112 ,  114 ,  115 ,  116 ,  117 ,  118 ,  119 ,  125 ,  135 ,  137 ,  138 ,  140 ,  143 ,  144 ) 
      and zptb_nachisl.shifr< 500 ) and
	zptb_nachisl.year=datepart(yy, dateadd(mm, -@cnt_mes, @date_beg)) and
	zptb_nachisl.mes=datepart(mm, dateadd(mm, -@cnt_mes, @date_beg)) and 
  #tmp4.year=zptb_nachisl.year and 
  #tmp4.mes=zptb_nachisl.mes
group by 
  zptb_nachisl.year, zptb_nachisl.mes, #tmp4.day 

возможно изменения проявят проблему

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35925396
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,
Проблема решилась... путем правки ХП...
Вкратце Recordset- не возвращал те месяцы, в которых количество календарных дней или сумма начислений были NULL.
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35925502
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что в принципе и должно было показать моё изменение


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
    #35925631
Sergey057
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, Нет, решилось вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
-- 	расчет количества календарных дней за  12  предыдущих месяцев
	CREATE TABLE #tmp4 (day tinyint, tn smallint, mes tinyint, year smallint)
	INSERT #tmp4(day, tn, mes, year) 
	SELECT   0 , tn, month(date), year(date) FROM #tmp3
	WHERE tn=@tn 
	AND date BETWEEN @firstdate AND @lastdate
	GROUP BY tn, month(date), year(date) ORDER BY year(date), month(date)
	SELECT countday= COUNT(p), tn, mes=month(date), year=year(date) INTO #tmp100 FROM #tmp3
	WHERE tn=@tn 
	AND date BETWEEN @firstdate AND @lastdate
	AND p NOT IN ('Б','О','А','У','Р','Д','Е','Я') 
	GROUP BY tn, month(date), year(date)
	UPDATE #tmp4 SET day =countday FROM #tmp100 a INNER JOIN #tmp4 b ON a.mes = b.mes AND a.year = b.year
--select * from #tmp4
--select * from #tmp100
-- 	расчет начислений за  12  предыдущих месяцев
DECLARE @nachislrows tinyint
WHILE @cnt_mes<= 12 
  BEGIN
	SELECT @nachislrows= COUNT(tn) FROM zptb_nachisl WHERE zptb_nachisl.year=DATEPART(yy, DATEADD(mm, -@cnt_mes, @date_beg)) AND
			zptb_nachisl.mes=DATEPART(mm, DATEADD(mm, -@cnt_mes, @date_beg)) AND tn=@tn
	--PRINT @nachislrows	
	IF @nachislrows	=  0  
	BEGIN
			INSERT #Tmp( Day, Summa, Prem, mes, year)
		     	SELECT #tmp4.day,  0 ,  0 , #tmp4.mes, #tmp4.year FROM #tmp4 WHERE #tmp4.tn=@tn AND
			#tmp4.year=DATEPART(yy, DATEADD(mm, -@cnt_mes, @date_beg)) AND
			#tmp4.mes=DATEPART(mm, DATEADD(mm, -@cnt_mes, @date_beg))
	END
	ELSE
	BEGIN
		INSERT #Tmp( Day, Summa, Prem, mes, year)
		     	SELECT #tmp4.day, SUM(CASE
			 WHEN (zptb_nachisl.shifr NOT IN ( 5 ,  15 ,  106 ,  109 ,  110 ,  112 ,  114 ,  115 ,  116 ,  117 ,  118 ,  119 ,  125 ,  135 ,  137 ,  138 ,  140 ,  143 ,  144 ) AND
		             zptb_nachisl.shifr< 500 )  THEN summa ELSE  0  END), 
			 0 , zptb_nachisl.mes, zptb_nachisl.year
			FROM zptb_nachisl, #tmp4 WHERE zptb_nachisl.tn=@tn AND #tmp4.tn=zptb_nachisl.tn AND 
			zptb_nachisl.year=DATEPART(yy, DATEADD(mm, -@cnt_mes, @date_beg)) AND
			zptb_nachisl.mes=DATEPART(mm, DATEADD(mm, -@cnt_mes, @date_beg)) AND #tmp4.year=zptb_nachisl.year AND #tmp4.mes=zptb_nachisl.mes
			GROUP BY zptb_nachisl.year, zptb_nachisl.mes, #tmp4.day 
	   END
	   SELECT @cnt_mes=@cnt_mes+ 1 
  END
То есть сначала формирую временную таблицу со всеми календарными днями =0, а потом апдейтирую ее реальными данными. Потом в основной таблице проверяю - если нет сумм за текущий месяц, принудительно ставлю сумма =0. Может кривовато, но работает...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / RDO возвращает не все значения. В чем может быть проблема? VB 6.0 и MS SQL server 2000
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]