Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по компонентам для Delphi, C++ Builder разных версий

Модерирует : ShIvADeSt

ShIvADeSt (26-06-2017 02:39): Продолжение тут
http://forum.ru-board.com/topic.cgi?forum=33&topic=14667
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение раздела http://forum.ru-board.com/topic.cgi?forum=33&topic=6607&start=0  
Ссылки приветствуются.

См. также:

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:33 20-06-2007 | Исправлено: XPerformer, 14:41 24-10-2013
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Frodo_Torbins
на фейсе я только показывать буду, менять моно и програмно, пасиб посмотрим

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 13:39 15-11-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посоветуйте как лучше организовать мастер-деталь на компонентах DAC на StoredProc. Использую IBDAC TIBCStoredProc, но конкретный DAC неважен.
Т.е. имеем хранимые процедуры MASTER_SELECT и DETAIL_SELECT (MAS_ID), соответственно для выборки мастер набора и деталь набора, MAS_ID понятно что за параметр. В свойствах SQL
у MasterStoredProc: "SELECT * FROM MASTER_SELECT",
у DetailStoredProc: "SELECT * FROM DETAIL_SELECT (:MAS_ID)".
В DetailStoredProc.BeforeExecute:
DetailStoredProc.ParamByName('MAS_ID').Value := MasterStoredProc.FieldValues['ID'];
 
У TIBCStoredProc есть public свойство MasterSource, но даже если DetailStoredProc.MasterSource присвоить правильное значение, деталь не дёргается. Если дёргать DetailStoredProc.Execute в MasterStoredProc.AfterScroll получается очень медленно. Есть какой рецепт на этот случай? Или забить и пользовать TIBCQuery?

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 17:21 15-11-2011 | Исправлено: AlexCoRu, 17:23 15-11-2011
ermakov_igor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Или забить и пользовать TIBCQuery?

 
Советую именно так, поскольку запрос на выборку "всего из всего" не стоит делать в хранимой процедуре. Смысл процедуры в том чтобы "тяжелые" вычисления переложить с клиента на сервер, а это не тот случай.
С уваженем

Всего записей: 51 | Зарегистр. 22-02-2008 | Отправлено: 16:10 16-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
народ , чет я sql подзабыл, подсобите с запросом
есть мастер - детал табличка
Table1 F1,F2,MasterID
Table2 F3,F4,MasterID,DetalID
надо выбрать все записи мастера для которого:  
                                                            есть записи в детале;
                                                            нет записей в детале
причем желательно через переменную чтобы был один запрос :0 - нет записей,1- есть записи

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 18:12 16-11-2011
Chef



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста простой компонент под xe, для сжатия/распаковки массива байт методом deflate (т.е. без каких-либо заголовков и crc)

Всего записей: 221 | Зарегистр. 22-04-2006 | Отправлено: 19:05 16-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Извините, не совсем точно поставил задачу - надо используя один запрос выбрать
1. все записи из мастер таблицы
2. только те записи мастера у которых есть записи в детали
3. только те записи мастера у которых нет записей в детали
записи детали меня не интересуют , только сам факт есть/нет
Как такую задачу реализовать???

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 19:12 16-11-2011
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Chef
Самый простой вариант идет в комплекте с самой XE: source\rtl\common\ZLib.pas
Более продвинутое обновление (автор тот же): http://www.base2ti.com/?id=delphi.zlib

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 19:23 16-11-2011
Chef



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur
zlib это deflate + заголовки. Насколько я понимаю, первый вообще такое не умеет, а во втором можно как-то через windowBits. Но мне бы что-нибудь ещё попроще

Всего записей: 221 | Зарегистр. 22-04-2006 | Отправлено: 19:51 16-11-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol, примерно так:

Код:
select TABLE1.*, A.COUNT_ALL
from TABLE1
left outer join (select MASTER_ID, count(*) COUNT_ALL
                from TABLE2
                group by MASTER_ID) A on (TABLE1.MASTER_ID = A.MASTER_ID)
where coalesce(A.COUNT_ALL, :PARAM) > 0

A.COUNT_ALL IS NULL у записей у которых нет детали, следовательно
если PARAM=0, запрос вернёт записи у которых есть записи в детали
если PARAM>0, запрос вернёт все записи
Третий вариант с ходу не соображу, устал уже сегодня.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 19:58 16-11-2011 | Исправлено: AlexCoRu, 19:59 16-11-2011
ermakov_igor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol
 
Чтобы более наглядно как то так:
 
select  
        master.*,  
        (select count(*) from details where details.mas_id=master.id) as recordcountindetails
 from master
 
master. details соответственно имина таблиц
запрос вернет в поле recordcountindetails или кол-во если есть или пусто (null)

Всего записей: 51 | Зарегистр. 22-02-2008 | Отправлено: 20:22 16-11-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ermakov_igor, в твоём варианте, вроде, подзапрос к даталь будет вполнятся для каждой записи из мастер. В Firebirde джоины выполняются быстрее других операторов, как у других не знаю точно, оптимизаторы у всех разные.
К тому ж, в основной select A.COUNT_ALL добавлен для информативности, его можно и убрать.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 20:33 16-11-2011 | Исправлено: AlexCoRu, 20:37 16-11-2011
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Chef
Что-то я наверное не понял проблемы...
Создать memorystream, закинуть туда массив, запаковать -> profit!
Что не так?
Пример от FibPlus

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 22:15 16-11-2011
ermakov_igor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
 
Ну ваш вариант я видел поэтому добавил свой, чтоб автору было из чего выбирать. Для разнообразия еще вариант с join-ом:
select  
        m.*,  
        case when d.id is null then 'no details'
               when d.id is not null then 'has details'
        end as checkdetails
from master m left join details d  
         on (d.mas_id=m.id)
 
Про Firebirde  Вы сказали, из своего опыта в MySql лучше делать join. в Postgres оба варианта почти одинаково работают.  
С уважением ...

Всего записей: 51 | Зарегистр. 22-02-2008 | Отправлено: 22:19 16-11-2011
mirfut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
 
есть детали:
 
select t1.* from table1 t1
where exists(select DetailId from table2 t2 where t2.MasterId=t1.MasterId)
 
нет деталей:
 
select t1.* from table1 t1
where not exists(select DetailId from table2 t2 where t2.MasterId=t1.MasterId)

Всего записей: 82 | Зарегистр. 14-12-2005 | Отправлено: 09:35 17-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mirfut
такой запрос я и сам мог написать,если Вы внимательно читали просьбу - мне все надо реализовать одним запросом, но всеравно спасибо.
AlexCoRu
Твой запрос работает, за одним исключением - нельзя выбрать те записи у которых нет записей детали
where coalesce(A.COUNT_ALL, ARAM) > 0 параметр интежер - is null не введеш
 
 

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 10:02 17-11-2011
ermakov_igor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Извиняюсь, последний раз упустил из виду повторяющиеся записи, надо distinct ставить:
select distinct * from
(select  
        m.*,  
        case when d.id is null then 'no details'
               when d.id is not null then 'has details'
        end as checkdetails
from master m left join details d  
         on (d.mas_id=m.id))

Всего записей: 51 | Зарегистр. 22-02-2008 | Отправлено: 10:14 17-11-2011
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MagistrAnatol, одним параметром не обойтись, надо 2
where coalesce(A.COUNT_ALL, ARAM) > 0
меняем на
where ((A.COUNT_ALL is null) and (:PARAM1 = 1)) or ((A.COUNT_ALL is not null) and (:PARAM2 = 1))
PARAM1 = 0, не включать не имеющие деталь
PARAM1 = 1, включать не имеющие деталь
PARAM2 = 0, не включать имеющие деталь
PARAM2 = 1, включать имеющие деталь
Вроде так, не проверял.




Крайнее предупреждение, после этого запрет на пост в моем разделе. Темы не путайте.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 10:17 17-11-2011 | Исправлено: ShIvADeSt, 14:21 17-11-2011
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MagistrAnatol

Цитата:
1. все записи из мастер таблицы  
2. только те записи мастера у которых есть записи в детали  
3. только те записи мастера у которых нет записей в детали  

Ну можно, конечно, с udf выкрутиться:
where (:Param is Null) or (sign(select count(*) ... ) = aram)
{Null - все, 0 - без деталей, 1 - с деталями}
Но мне этот минимализм кажется излишним.




Крайнее предупреждение, после этого запрет на пост в моем разделе. Темы не путайте.

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 10:25 17-11-2011 | Исправлено: ShIvADeSt, 14:22 17-11-2011
MagistrAnatol



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AlexCoRu
Цікаво , но работает, я чет затормозил насчет двух параметров, но работает все отлично,
ща подгоню под свои нужды,ОГРОМНЫЙ СЕНКС
 
 
Добавлено:
Arvur
запрос интересный, но опять же нул не введеш - Param принимает тип инт
Пасибо всем принявшим участие
 
Добавлено:
AlexCoRu
пробую сварганить процедуру по Вашему селекту
и получаю предупреждение asterisk in select statement may cause problem later
а если перечисляю поля мастера получаю ошибку  Ambiguous field name between table ABO and derived table A .
ругается на ключевое поле мастера, ну а оно мне нуно в селекте
 
Добавлено:
может кому пригодится сделал так
select f1,f2, ....,MASTER_ID  from table 1
where MASTER_ID in (
select MASTER_ID  from TABLE1  
 left outer join (select MASTER_ID, count(*) COUNT_ALL  
                 from TABLE2  
                 group by MASTER_ID) A on (TABLE1.MASTER_ID = A.MASTER_ID)
 where ((A.COUNT_ALL is null) and (:PARAM1 = 1)) or ((A.COUNT_ALL is not null) and (:PARAM2 = 1))
                                   )
подкоректируйте если моно  проще  




Крайнее предупреждение, после этого запрет на пост в моем разделе. Темы не путайте.

Всего записей: 2120 | Зарегистр. 09-04-2003 | Отправлено: 10:27 17-11-2011 | Исправлено: ShIvADeSt, 14:19 17-11-2011
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может хватит здесь своими запросами кидаться? Ваши запросы нафиг здесь никому не нужны.
Есть аська, чаты, почты, ЛС... в конце-то концов

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 12:56 17-11-2011
   

Страницы: 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 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по компонентам для Delphi, C++ Builder разных версий
ShIvADeSt (26-06-2017 02:39): Продолжение тут
http://forum.ru-board.com/topic.cgi?forum=33&topic=14667


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru