Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с решением .... / 4 сообщений из 4, страница 1 из 1
19.12.2007, 12:51
    #35020026
Klera
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с решением ....
Ситуация следующая, в программе Visual Basic есть функция:
Код: 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.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
Public Function g_saldo(ByVal k_pr, ByVal DATA)
Dim db As Database
Dim rs As Recordset
Dim str As String
Dim dat_begin As Date
Dim dbegin

s_money =  0 
s_money_1 =  0 
s_money_2 =  0 
s_1 =  0 
s_2 =  0 
str = "SELECT year, k_month, saldo, data FROM Saldo " + _
      "WHERE ((k_pred =" + ValToStr(k_pr) + ") AND " + _
      "(DATA<=" + CDateSQL(DATA) + ")) " + _
      "ORDER BY DATA DESC"
Set rs = dbSprav.OpenRecordset(str, dbOpenDynaset, dbSeeChanges)

s =  0 
dbegin = False
With rs
If .RecordCount >  0  Then  'взять первое сальдо
  s = StrToVal(.Fields("saldo").Value)
  dat_begin = .Fields("data").Value
  dbegin = True
End If
.Close
End With

'начислено ------------------------------------------------------------------------------------------------------------
If dbegin Then
  str = "SELECT Sum(d_fact.summa) AS s_summa, Sum(d_fact.sum) AS s_sum, Sum(d_fact.nds) AS s_nds, " + _
        "Sum(d_fact.rasxod) AS s_rasxod, d_fact.pnds as p_nds, d_fact.d_factura, d_fact.data_priem " + _
        "FROM (D_FACT LEFT JOIN s_dzo ON D_FACT.K_DZO = s_dzo.k_dzo) " + _
        "LEFT JOIN S_PRED ON D_FACT.K_PRED = S_PRED.K_PRED " + _
        "WHERE (d_fact.k_pred=" + ValToStr(k_pr) + _
        " and iif(isnull(d_fact.data_priem),d_fact.d_factura,d_fact.data_priem)>=" + CDateSQL(dat_begin) + _
        " and iif(isnull(d_fact.data_priem),d_fact.d_factura,d_fact.data_priem)<" + CDateSQL(DATA) + _
        " AND (d_fact.k_avans=0 or isnull(d_fact.k_avans)) ) " + _
        IIf(Len(add_usl) >  0 , " and " + add_usl, "") + _
        " group by d_fact.pnds, d_fact.d_factura, d_fact.data_priem "
Else
  str = "SELECT Sum(d_fact.summa) AS s_summa, Sum(d_fact.sum) AS s_sum, Sum(d_fact.nds) AS s_nds, " + _
        "Sum(d_fact.rasxod) AS s_rasxod, d_fact.pnds as p_nds, d_fact.d_factura, d_fact.data_priem " + _
        "FROM ((D_FACT LEFT JOIN s_dzo ON D_FACT.K_DZO = s_dzo.k_dzo) " + _
        "LEFT JOIN S_PRED ON D_FACT.K_PRED = S_PRED.K_PRED) " + _
        "LEFT JOIN S_GRBUD ON D_FACT.K_GRBUD = S_GRBUD.K_GRBUD " + _
        "WHERE (d_fact.k_pred=" + ValToStr(k_pr) + _
        " and iif(isnull(d_fact.data_priem),d_fact.d_factura,d_fact.data_priem)<" + CDateSQL(DATA) + _
        " AND (d_fact.k_avans=0 or isnull(d_fact.k_avans)) ) " + _
        IIf(Len(add_usl) >  0 , " and " + add_usl, "") + _
        " group by d_fact.pnds, d_fact.d_factura, d_fact.data_priem"
End If
Set rs = dbSprav.OpenRecordset(str, dbOpenDynaset, dbSeeChanges)

s_plus =  0 
s_pl =  0 
r_itog_dolg =  0 
s_nds20 =  0 
s_nds18 =  0 
s_nds =  0 

s_plus_1 =  0 
s_pl_1 =  0 
r_itog_dolg_1 =  0 
s_nds20_1 =  0 
s_nds18_1 =  0 
s_nds_1 =  0 

s_plus_2 =  0 
s_pl_2 =  0 
r_itog_dolg_2 =  0 
s_nds20_2 =  0 
s_nds18_2 =  0 
s_nds_2 =  0 

With rs
If .RecordCount >  0  Then
  Do While Not .EOF
    s_plus = s_plus + StrToVal(.Fields("s_summa").Value)
    s_pl = s_pl + StrToVal(.Fields("s_sum").Value)
    r_itog_dolg = r_itog_dolg + StrToVal(.Fields("s_rasxod").Value)
    p_nds = StrToVal(.Fields("p_nds").Value)
    'сумма НДС
    If Abs(p_nds -  0 . 18 ) <  0 . 001  Then
      s_nds18 = s_nds18 + StrToVal(.Fields("s_nds").Value)
    ElseIf Abs(p_nds -  0 . 2 ) <  0 . 001  Then
      s_nds20 = s_nds20 + StrToVal(.Fields("s_nds").Value)
    End If
    s_nds = s_nds + StrToVal(.Fields("s_nds").Value)
    
    If (.Fields("d_factura").Value < CDate(# 1 / 1 / 2006 #)) Then
      s_plus_1 = s_plus_1 + StrToVal(.Fields("s_summa").Value)
      s_pl_1 = s_pl_1 + StrToVal(.Fields("s_sum").Value)
      r_itog_dolg_1 = r_itog_dolg_1 + StrToVal(.Fields("s_rasxod").Value)
      p_nds = StrToVal(.Fields("p_nds").Value)
      'сумма НДС
      If Abs(p_nds -  0 . 18 ) <  0 . 001  Then
        s_nds18_1 = s_nds18_1 + StrToVal(.Fields("s_nds").Value)
      ElseIf Abs(p_nds -  0 . 2 ) <  0 . 001  Then
        s_nds20_1 = s_nds20_1 + StrToVal(.Fields("s_nds").Value)
      End If
      s_nds_1 = s_nds_1 + StrToVal(.Fields("s_nds").Value)
      
    Else
      s_plus_2 = s_plus_2 + StrToVal(.Fields("s_summa").Value)
      s_pl_2 = s_pl_2 + StrToVal(.Fields("s_sum").Value)
      r_itog_dolg_2 = r_itog_dolg_2 + StrToVal(.Fields("s_rasxod").Value)
      p_nds = StrToVal(.Fields("p_nds").Value)
      'сумма НДС
      If Abs(p_nds -  0 . 18 ) <  0 . 001  Then
        s_nds18_2 = s_nds18_2 + StrToVal(.Fields("s_nds").Value)
      ElseIf Abs(p_nds -  0 . 2 ) <  0 . 001  Then
        s_nds20_2 = s_nds20_2 + StrToVal(.Fields("s_nds").Value)
      End If
      s_nds_2 = s_nds_2 + StrToVal(.Fields("s_nds").Value)
    End If
    .MoveNext
  Loop
End If
rs.Close
End With

'оплачено ----------------------------------------------------------------------------------------------------------
s_minus =  0 
s_min =  0 
s_minus_1 =  0 
s_min_1 =  0 
s_minus_2 =  0 
s_min_2 =  0 

If dbegin Then
  MsgBox "Ошибка при вычислении задолженности", vbCritical
  Exit Function
  strs = "select kniga.summa,kniga.nds,kniga.money, d_fact.summa,d_fact.rasxod,d_fact.pnds,d_fact.d_factura " + _
         "FROM ((((KNIGA LEFT JOIN D_FACT ON KNIGA.KEY_FACT = D_FACT.KEY_FACT) " + _
         "LEFT JOIN s_dzo ON D_FACT.K_DZO = s_dzo.k_dzo) " + _
         "LEFT JOIN S_PRED ON KNIGA.K_PRED = S_PRED.K_PRED) " + _
         "LEFT JOIN [money] ON KNIGA.key_money = money.key_money) " + _
         "LEFT JOIN S_GRBUD ON D_FACT.K_GRBUD = S_GRBUD.K_GRBUD " + _
         "where (d_fact.k_pred = " + ValToStr(k_pr) + " )" + _
         " and (not d_fact.key_fact is null) " + _
         " and kniga.dataP>=" + CDateSQL(dat_begin) + " and kniga.dataP<" + CDateSQL(DATA) + _
         " and ((kniga.k_doc1=1 and kniga.k_doc2=2) or " + _
         "(kniga.k_doc1=1 and kniga.k_doc2=4) or " + _
         "(kniga.k_doc1=1 and kniga.k_doc2=6) or " + _
         "(kniga.k_doc1=1 and kniga.k_doc2=12)) " + _
         IIf(Len(add_usl) >  0 , " and " + add_usl, "")
Else
  strs = "select kniga.key_fact,sum(kniga.summa) as s_summa,sum(kniga.nds) as s_nds,sum(kniga.money) as s_money " + _
         "FROM ((((KNIGA LEFT JOIN D_FACT ON KNIGA.KEY_FACT = D_FACT.KEY_FACT) " + _
         "LEFT JOIN s_dzo ON D_FACT.K_DZO = s_dzo.k_dzo) " + _
         "LEFT JOIN S_PRED ON KNIGA.K_PRED = S_PRED.K_PRED) " + _
         "LEFT JOIN [money] ON KNIGA.key_money = money.key_money) " + _
         "LEFT JOIN S_GRBUD ON D_FACT.K_GRBUD = S_GRBUD.K_GRBUD " + _
         "where (d_fact.k_pred = " + ValToStr(k_pr) + " )" + _
         " and (not d_fact.key_fact is null) " + _
         " and dataP<" + CDateSQL(DATA) + _
         " and ((kniga.k_doc1=1 and kniga.k_doc2=2) or " + _
         "(kniga.k_doc1=1 and kniga.k_doc2=4) or " + _
         "(kniga.k_doc1=1 and kniga.k_doc2=6) or " + _
         "(kniga.k_doc1=1 and kniga.k_doc2=12)) " + _
         IIf(Len(add_usl) >  0 , " and " + add_usl, "") + _
         " group by kniga.key_fact"
End If
Set rs_kniga = dbSprav.OpenRecordset(strs, dbOpenDynaset)
With rs_kniga
If .RecordCount >  0  Then
  Do While Not .EOF
   
    summa_f =  0 
    rasxod_f =  0 
    pnds =  0 
    d_factura = Null
    key_fact = .key_fact
    strs = "select summa, rasxod, pnds, d_factura from [d_fact] where key_fact=" + ValToStr(key_fact)
    Set rs_fact = dbSprav.OpenRecordset(strs, dbOpenDynaset)
    If rs_fact.RecordCount >  0  Then
      summa_f = StrToVal(rs_fact.Fields("summa"))
      rasxod_f = StrToVal(rs_fact.Fields("rasxod"))
      pnds = StrToVal(rs_fact.pnds)
      d_factura = rs_fact.Fields("d_factura")
    End If
    rs_fact.Close
    
    
    kniga_summa = StrToVal(.Fields("s_summa").Value)
    kniga_nds = StrToVal(.Fields("s_nds").Value)
    kniga_money = StrToVal(.Fields("s_money").Value)
    
    
    'оплачено квтч
    r = rasxod_f - ostatok_kvt( 0 , rasxod_f, summa_f, kniga_summa)

    r_itog_dolg = r_itog_dolg - r
    
    s_minus = s_minus + kniga_summa
    s_min = s_min + kniga_money
    'сумма НДС
    If Abs(pnds -  0 . 18 ) <  0 . 001  Then
      s_nds18 = s_nds18 - kniga_nds
    ElseIf Abs(pnds -  0 . 2 ) <  0 . 001  Then
      s_nds20 = s_nds20 - kniga_nds
    End If
    s_nds = s_nds - kniga_nds
    
    If d_factura < CDate(# 1 / 1 / 2006 #) Then
      r_itog_dolg_1 = r_itog_dolg_1 - r
      s_minus_1 = s_minus_1 + kniga_summa
      s_min_1 = s_min_1 + kniga_money
      'сумма НДС
      If Abs(pnds -  0 . 18 ) <  0 . 001  Then
        s_nds18_1 = s_nds18_1 - kniga_nds
      ElseIf Abs(pnds -  0 . 2 ) <  0 . 001  Then
        s_nds20_1 = s_nds20_1 - kniga_nds
      End If
      s_nds_1 = s_nds_1 - kniga_nds
      
    Else
      r_itog_dolg_2 = r_itog_dolg_2 - r
      s_minus_2 = s_minus_2 + kniga_summa
      s_min_2 = s_min_2 + kniga_money
      'сумма НДС
      If Abs(pnds -  0 . 18 ) <  0 . 001  Then
        s_nds18_2 = s_nds18_2 - kniga_nds
      ElseIf Abs(pnds -  0 . 2 ) <  0 . 001  Then
        s_nds20_2 = s_nds20_2 - kniga_nds
      End If
      s_nds_2 = s_nds_2 - kniga_nds
    End If
    .MoveNext
  Loop
End If
rs_kniga.Close
End With

s_money = s + s_pl - s_min
s_money_1 = s_1 + s_pl_1 - s_min_1
s_money_2 = s_2 + s_pl_2 - s_min_2

g_saldo = s + s_plus - s_minus
s_1 = s_1 + s_plus_1 - s_minus_1
s_2 = s_2 + s_plus_2 - s_minus_2

If s_money_2 <>  0  Or s_2 <>  0  Then
  br = True
End If

End Function
в другой функции мы ее вызываем, для набора k_pred,

но выходит долго, поэтому следует ее перенести в хранимую процедуру(для более быстрой отработки) или в пользовательскую ф-кцию, смущают if
помогите плис...
...
Рейтинг: 0 / 0
19.12.2007, 13:23
    #35020133
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с решением ....
В sql тоже есть if
Код: plaintext
1.
2.
3.
4.
5.
6.
if что-то там begin
/**/
end else if что-то там еще begin
/**/
end else begin
/**/
end
...
Рейтинг: 0 / 0
19.12.2007, 17:24
    #35021262
student-uni
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с решением ....
попробуи отсоединенныи рекордсет
Ваш наскоко я понимаю присоединенныи.
Данные актуальные, но каждыи раз в цикле дергается БД.
Поэтому и медленно.

Отсоединенныи сосет данные один раз,
и дальше с ними работает не обращаеясь к бд
выходит много быстрее
...
Рейтинг: 0 / 0
19.12.2007, 17:41
    #35021345
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с решением ....
AntonariyВ sql тоже есть if
Код: plaintext
1.
2.
3.
4.
5.
6.
if что-то там begin
/**/
end else if что-то там еще begin
/**/
end else begin
/**/
end

+1
еще case может пригодится
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с решением .... / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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