powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / ERP и учетные системы [игнор отключен] [закрыт для гостей] / Новый TECDOC 2Q2017/3Q2017
13 сообщений из 13, страница 1 из 1
Новый TECDOC 2Q2017/3Q2017
    #39473550
tecdocru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С 2017 года TECDOC полностью поменял структуру . У 99% начавших работу с новым текдоком, возникли трудности с запросами к базе mySQL. По просьбам страждущих, выкладываю готовый php-класс для работы с новыми версиями базы.

Код: php
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.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
<?php
// (c) tecdoc.ru
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
	
class DBase {
	
	const HOST 	= '';
	const USER 	= '';
	const PASS 	= '';
	const NAME 	= '';
	
    private static $instance;
		
    public static function instance()
    {
        if (!isset(DBase::$instance)) {
            $db = array(
                'host' => static::HOST,
                'user' => static::USER,
                'pass' => static::PASS,
                'name' => static::NAME,
            );
            self::connect($db);
        }
        return DBase::$instance;
    }
 
 //	$asArray - возвращать объект или массив
 
    public static function select($query, $asArray = false)
    {
        $mysqli_result = self::instance()->query($query);
        if ($mysqli_result) {
            $r = array();
            while ($row = $mysqli_result->fetch_object()) {
                $r[] = $asArray ? (array) $row : $row;
            } 
            return $r;
        }
        return array();
    }
 
    public static function selectRow($query, $asArray = false)
    {
        $mysqli_result = self::instance()->query($query);
        if ($mysqli_result) {
            $row = $mysqli_result->fetch_row();
            if ($row) {
                if ($asArray) {
                    return (array) $row;
                }
                else {
                    return $row;
                }
            }
        }
        return array();
    }
 
    public static function selectCol($query)
    {
        $rows = self::select($query,true); 
        return array_map(function ($row) {return array_shift($row);}, $rows);
    }
 
    public static function selectCell($query)
    {
        $mysqli_result = self::instance()->query($query);
        if($mysqli_result) {
            $row = $mysqli_result->fetch_row();
            if ($row) {
                return $row[0];
            }
        }
        return NULL;
    }
 
    public static function query($query)
    {
        return self::instance()->query($query);
    }

    public static function connect(array $db)
    {
        $mysqli = new mysqli($db['host'], $db['user'], $db['pass'], $db['name']);
 
        if (!$mysqli->connect_error) {
			$mysqli->set_charset("utf8");
            DBase::$instance = $mysqli;
        }
        return $mysqli;
    }
}

class Tecdoc extends DBase {
	
	
//====================================//
// (1) АВТОМОБИЛИ
//===================================//
	
	
	// (1.1) Марки авто (производители)
	static function getMakes( $type )
		{
			switch ($type) {
			case 'passenger':
				$where = " AND ispassengercar = 'True'";
				break;
			case 'commercial':
				$where = " AND iscommercialvehicle = 'True'";
				break;
			case 'motorbike':
				$where = " AND ismotorbike  = 'True' AND haslink = 'True'";
				break;
			case 'engine':
				$where = " AND isengine = 'True'";
				break;
			case 'axle':
				$where = " AND isaxle = 'True'";
				break;

			}
			
			$order = $type == 'motorbike' ? 'description' : 'matchcode';
			
			return parent::select("
				SELECT id, description name
				FROM manufacturers
				WHERE canbedisplayed = 'True' " . $where . "
				ORDER BY " . $order);
		} 
		
	// (1.2) Модели авто 	
	static function getModels( $make_id, $type, $pattern = null )
		{
		
			switch ($type) {
			case 'passenger':
				$where = " AND ispassengercar = 'True'";
				break;
			case 'commercial':
				$where = " AND iscommercialvehicle = 'True'";
				break;
			case 'motorbike':
				$where = " AND ismotorbike  = 'True'";
				break;
			case 'engine':
				$where = " AND isengine = 'True'";
				break;
			case 'axle':
				$where = " AND isaxle = 'True'";
				break;

			}
			
			if( $pattern != null ) $where .= " AND description LIKE '" . $pattern . "%'";

			return parent::select("
				SELECT id, description name, constructioninterval
				FROM models
				WHERE canbedisplayed = 'True'
				AND manufacturerid = " . (int)$make_id . " " . $where . "
				ORDER BY description");
		}
	
	// (1.3) Модификации авто 
	static function getModifications( $model_id, $type ){
        switch ($type) {
			case 'passenger':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM passanger_cars pc 
					LEFT JOIN passanger_car_attributes a on pc.id = a.passangercarid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND ispassengercar = 'True'");
				break;
			case 'commercial':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM commercial_vehicles cv 
					LEFT JOIN commercial_vehicle_attributes a on cv.id = a.commercialvehicleid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND iscommercialvehicle = 'True'");
				break;
			case 'motorbike':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM motorbikes m 
					LEFT JOIN motorbike_attributes a on m.id = a.motorbikeid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND ismotorbike = 'True'");
				break;
			case 'engine':
				return parent::select("
					SELECT id, fulldescription name, salesDescription, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM engines e 
					LEFT JOIN engine_attributes a on e.id= a.engineid
					WHERE canbedisplayed = 'True'
					AND manufacturerId = " . (int)$model_id . " AND isengine = 'True'");
				break;
			case 'axle':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM axles ax 
					LEFT JOIN axle_attributes a on ax.id= a.axleid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND isaxle = 'True'");
				break;

			}
    }
	
	// (1.4) Марка по ID
	static function getMake( $id, $type )
		{
			switch ($type) {
			case 'passenger':
				$where = " AND ispassengercar = 'True'";
				break;
			case 'commercial':
				$where = " AND iscommercialvehicle = 'True'";
				break;
			case 'motorbike':
				$where = " AND ismotorbike  = 'True' AND haslink = 'True'";
				break;
			case 'engine':
				$where = " AND isengine = 'True'";
				break;
			case 'axle':
				$where = " AND isaxle = 'True'";
				break;

			}
			return parent::select("
				SELECT id, description name
				FROM manufacturers
				WHERE canbedisplayed = 'True' " . $where . " AND id = " . (int)$id . ";
			");
		} 	
		
	// (1.5) Модель по ID
	static function getModel( $id, $type ){
		
			switch ($type) {
				case 'passenger':
					$where = " AND ispassengercar = 'True'";
					break;
				case 'commercial':
					$where = " AND iscommercialvehicle = 'True'";
					break;
				case 'motorbike':
					$where = " AND ismotorbike  = 'True'";
					break;
				case 'engine':
					$where = " AND isengine = 'True'";
					break;
				case 'axle':
					$where = " AND isaxle = 'True'";
					break;

				}
				
			return parent::select("
				SELECT id, description name, constructioninterval
				FROM models
				WHERE canbedisplayed = 'True' " . $where . " AND id = " . (int)$id . "
			");
    }
	
	// (1.6) Модификация по ID
	static function getType( $id, $type ){
        switch ($type) {
			case 'passenger':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM passanger_cars pc 
					LEFT JOIN passanger_car_attributes a on pc.id = a.passangercarid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND ispassengercar = 'True'");
				break;
			case 'commercial':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM commercial_vehicles cv 
					LEFT JOIN commercial_vehicle_attributes a on cv.id = a.commercialvehicleid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND iscommercialvehicle = 'True'");
				break;
			case 'motorbike':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM motorbikes m 
					LEFT JOIN motorbike_attributes a on m.id = a.motorbikeid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND ismotorbike = 'True'");
				break;
			case 'engine':
				return parent::select("
					SELECT id, fulldescription name, salesDescription, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM engines e 
					LEFT JOIN engine_attributes a on e.id = a.engineid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND isengine = 'True'");
				break;
			case 'axle':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM axles ax 
					LEFT JOIN axle_attributes a on ax.id = a.axleid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND isaxle = 'True'");
				break;

			}
    }
	
//====================================//
// (2) Дерево категорий / разделы
//===================================//

	// (2.1) Построение дерева категорий изделий для заданного типа автомобиля (от родительского)
	/*
	Последовательно устанавливая следующие значения parentid, можно получить ещё 4 уровня дерева
	havechild -  Есть ли у этой категории подкатегории: 1 - Есть, 0 - Нет
	Если есть, то ее parentid ставим на вход метода
	*/
	static function getSections( $modification_id, $type, $parent=0 )
		{
			switch ($type) {
				case 'passenger':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM passanger_car_trees t1 
						INNER JOIN passanger_car_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.passangercarid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM passanger_car_trees WHERE passangercarid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'commercial':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM commercial_vehicle_trees t1 
						INNER JOIN commercial_vehicle_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.commercialvehicleid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM commercial_vehicle_trees WHERE commercialvehicleid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'motorbike':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM motorbike_trees t1 
						INNER JOIN motorbike_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.motorbikeid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM motorbike_trees WHERE motorbikeid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'engine':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM engine_trees t1 
						INNER JOIN engine_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.engineid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM engine_trees WHERE engineid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'axle':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM axle_trees t1 
						INNER JOIN axle_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.axleid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM axle_trees WHERE axleid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;

				}
		}
		
	// (2.2) Название раздела по ID - используется в СЕО
	static function getSectionName( $section_id, $type )
		{
			switch ($type) {
				case 'passenger':
					return parent::selectCell("SELECT description FROM passanger_car_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'commercial':
					return parent::selectCell("SELECT description FROM commercial_vehicle_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'motorbike':
					return parent::selectCell("SELECT description FROM motorbike_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'engine':
					return parent::selectCell("SELECT description FROM engine_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'axle':
					return parent::selectCell("SELECT description FROM axle_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;

				}
		}

	// (2.3) Поиск запчастей раздела
	static function getSectionParts( $modification_id, $section_id, $type )
		{
			switch ($type) {
				case 'passenger':
					return parent::select(" SELECT al.datasupplierarticlenumber part_number, s.description supplier_name, prd.description product_name
											FROM article_links al 
											JOIN passanger_car_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN passanger_car_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.passangercarid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 2
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'commercial':
					return parent::select(" SELECT al.datasupplierarticlenumber part_number, s.description supplier_name, prd.description product_name
											FROM article_links al 
											JOIN commercial_vehicle_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN commercial_vehicle_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.commertialvehicleid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 16
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'motorbike':
					return parent::select(" SELECT al.datasupplierarticlenumber part_number, s.description supplier_name, prd.description product_name
											FROM article_links al 
											JOIN motorbike_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN motorbike_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.motorbikeid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 777
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'engine':
					return parent::select(" SELECT pds.engineid, al.datasupplierarticlenumber part_number, prd.description product_name, s.description supplier_name
											FROM article_links al 
											JOIN engine_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN engine_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.engineid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 14
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'axle':
					return parent::select(" SELECT pds.axleid, al.datasupplierarticlenumber part_number, prd.description product_name, s.description supplier_name
											FROM article_links al 
											JOIN axle_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN axle_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.axleid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 19
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;

				}
		}
		
//====================================//
// (3) Информация об изделии
//===================================//	
	
	// (3.1) Оригинальные номера
	static function getOemNumbers( $number, $brand_id )
		{
			return parent::select("
					SELECT m.description, a.OENbr FROM article_oe a 
					JOIN manufacturers m ON m.id=a.manufacturerId 
					WHERE a.datasupplierarticlenumber='" . $number . "' AND a.supplierid='" . $brand_id . "'
				");
		}		
		
	// (3.2) Статус изделия
	static function getArtStatus( $number, $brand_id )
		{
			return parent::select("
					SELECT NormalizedDescription, ArticleStateDisplayValue FROM articles WHERE DataSupplierArticleNumber='" . $number . "' AND supplierId='" . $brand_id . "'
				");
		}	
		
	// (3.3) Характеристики изделия
	static function getArtAttributes( $number, $brand_id )
		{
			return parent::select("
					SELECT attributeinformationtype, displaytitle, displayvalue FROM article_attributes WHERE datasupplierarticlenumber='" . $number . "'  AND a.supplierid='" . $brand_id . "'
				");
		}	
		
	// (3.4) Файлы изделия
	static function getArtFiles( $number, $brand_id )
		{
			return parent::select("
					SELECT Description, PictureName FROM article_images WHERE DataSupplierArticleNumber='" . $number . "'  AND a.supplierId='" . $brand_id . "'
				");
		}
		
	// (3.5) Применимость изделия
	static function getArtVehicles( $number, $brand_id )
		{
			$result = [];
			$rows = parent::select("
					SELECT linkageTypeId, linkageId FROM article_li WHERE DataSupplierArticleNumber='" . $number . "' AND supplierId='" . $brand_id . "'
				");
			foreach ( $rows as &$row ){
				switch ($type) {
				case 'PassengerCar':
					$result[ $row['linkageTypeId'] ][] =  parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM passanger_cars p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'CommercialVehicle':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM commercial_vehicles p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'Motorbike':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM motorbikes p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'Engine':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, m.description make, '' model, p.constructioninterval, p.description FROM `engines` p 
																			JOIN manufacturers m ON m.id=p.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'Axle':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM axles p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;

				}				
			}
			return $result;
		}	
		
	// (3.6) Замены изделия
	static function getArtReplace( $number, $brand_id )
		{
			return parent::select("
					SELECT s.description supplier, a.replacenbr number FROM article_rn a 
					JOIN suppliers s ON s.id=a.replacesupplierid
					WHERE a.datasupplierarticlenumber='" . $number . "' AND a.supplierid='" . $brand_id . "'
				");
		}
		
	// (3.7) Аналоги-заменители
	static function getArtCross( $number, $brand_id )
		{
			return parent::select("
					SELECT DISTINCT s.description, c.PartsDataSupplierArticleNumber FROM article_oe a 
					JOIN manufacturers m ON m.id=a.manufacturerId 
					JOIN article_cross c ON c.OENbr=a.OENbr
					JOIN suppliers s ON s.id=c.SupplierId
					WHERE a.datasupplierarticlenumber='". $number ."' AND a.supplierid='" . $brand_id . "'
				");
		}	
		
	// (3.8) Комплектующие (части) изделия
	static function getArtParts( $number, $brand_id )
		{
			return parent::select("
					SELECT DISTINCT description Brand, Quantity, PartsDataSupplierArticleNumber FROM article_parts 
					JOIN suppliers ON id=PartsSupplierId
					WHERE DataSupplierArticleNumber='". $number ."' AND supplierId='" . $brand_id . "'
				");
		}
}

//$foo = Tecdoc::getMakes('passenger');
//echo '<pre>';
//print_r($foo);
//echo '</pre>';
// (c) tecdoc.ru
?>



Саму базу mySQL можно получить здесь .
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39473567
seomoneys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tecdocru,

У Вас не база, а какой-то винегрет:

1) В обход нормальным формам, некоторые сущности дублируются множества раз, вместо того чтобы быть объявлены один раз с первичным ключем и ссылаться на них через этот первичный ключ.

2) Использование VARCHAR поля `datasupplierarticlenumber` в качестве индекса, на таблицах объемом в 150-200 млн. строк, раздувает вашу базу до 200 ГБ. И к тому же дает неоднозначность привязки данных, поскольку datasupplierarticlenumber не уникален и у Вас есть вероятность получить таким образом данные для других артиклей.

3) Некоторые поля лишены логического смысла, к примеру `axles`.`iscommercialvehicle`, `axles`.`iscvmanufacturerid`, `axles`.`isengine`, `axles`.`ismotorbike`, `axles`.`ispassengercar`, `axles`.`istransporter` всегда будут 0(false) а `axles`.`isaxle` 1(true). Тоже самое и в других таблицах.

4) Вы выгрузили поля, которые относятся к ограничениям по странам `canbedisplayed`, `isvalidforcurrentcountry`, но они привязаны к битовым полям, которых у вас просто навсего нету в базе, поэтому они просто бесполезны.

5) Нет линковочных критериев авто к артиклям, или по крайне мере я их не вижу ни в примере ни в показанных таблицах.

6) Таблица `country_groups` должна ссылаться на страны из таблицы `countries`, чтобы можно было понять, какие страны входят в группу стран. Хотя без применимости и ограничений по странам, это бесполезная таблица.

7) У Вас не все изображения артиклей.

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

Если кому-то нужна нормальная мультиязычная база TecDoc 2017Q2 в MySQL формате, без дубликатов и непонятных полей и со всеми изображениями, пишите на seomoneys@gmail.com.
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39473689
tecdocru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Первое и самое главное - база создана абсолютно идентичной родной текдоковской. Как немцы назвали все, какие поля поставили - все скопировано, дабы не навредить. Поэтому про винегрет ближе к Новому году.

5. Мы уже опубликовали класс для тех, у кого не получается самостоятельно. В этом классе есть все необходимые запросы, включая связь артикула с ТС. Будьте внимательны.

7. Скиньте список недостающих? Иначе это просто домыслы.

Мы за Вами давно наблюдаем. Вместо здоровой конкуренции, от вас везде льется одна необоснованная грязь. Вы американец что-ли? У них это вошло в привычку бездоказательно обвинять. Ваши потуги сохранить доход вполне понятны, но давайте придерживаться общепринятых правил ведения бизнеса. Здоровая конкуренция. Не надо пытаться себя возвысить, опуская других. Оно как правило боком выходит. И со стороны люди все видят и сделают необходимые выводы. Кто молча работает, а кто ходит по форумам и за глаза поливает грязью.

seomoneystecdocru,

У Вас не база, а какой-то винегрет:

1) В обход нормальным формам, некоторые сущности дублируются множества раз, вместо того чтобы быть объявлены один раз с первичным ключем и ссылаться на них через этот первичный ключ.

2) Использование VARCHAR поля `datasupplierarticlenumber` в качестве индекса, на таблицах объемом в 150-200 млн. строк, раздувает вашу базу до 200 ГБ. И к тому же дает неоднозначность привязки данных, поскольку datasupplierarticlenumber не уникален и у Вас есть вероятность получить таким образом данные для других артиклей.

3) Некоторые поля лишены логического смысла, к примеру `axles`.`iscommercialvehicle`, `axles`.`iscvmanufacturerid`, `axles`.`isengine`, `axles`.`ismotorbike`, `axles`.`ispassengercar`, `axles`.`istransporter` всегда будут 0(false) а `axles`.`isaxle` 1(true). Тоже самое и в других таблицах.

4) Вы выгрузили поля, которые относятся к ограничениям по странам `canbedisplayed`, `isvalidforcurrentcountry`, но они привязаны к битовым полям, которых у вас просто навсего нету в базе, поэтому они просто бесполезны.

5) Нет линковочных критериев авто к артиклям, или по крайне мере я их не вижу ни в примере ни в показанных таблицах.

6) Таблица `country_groups` должна ссылаться на страны из таблицы `countries`, чтобы можно было понять, какие страны входят в группу стран. Хотя без применимости и ограничений по странам, это бесполезная таблица.

7) У Вас не все изображения артиклей.

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

Если кому-то нужна нормальная мультиязычная база TecDoc 2017Q2 в MySQL формате, без дубликатов и непонятных полей и со всеми изображениями, пишите на seomoneys@gmail.com.
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39477099
fatslon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, tecdocru совершенно прав. Из за этого предпочитаю не искать инфу на русскоязычных форумах, где на любой вопрос потоками льётся грязь.

Извините за оффтоп выше.

Вопрос, раньше tecdoc подключался через ODBC Transbase, а как сейчас? В 32bit system DSN драйверов с похожим именем теперь нет.

Буду признателен, если кто-то сможет подсказать новые способ и параметры подключения.
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39477206
tecdocru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fatslonДействительно, tecdocru совершенно прав. Из за этого предпочитаю не искать инфу на русскоязычных форумах, где на любой вопрос потоками льётся грязь.

Извините за оффтоп выше.

Вопрос, раньше tecdoc подключался через ODBC Transbase, а как сейчас? В 32bit system DSN драйверов с похожим именем теперь нет.

Буду признателен, если кто-то сможет подсказать новые способ и параметры подключения.

Раньше на дисках был текдок с полной базой информации о запчастях, транспорте, связях и прочем. А смысл все что есть на диске - это "оболочка" к веб-сервису Tecalliance. Поэтому особого смысла к нему искать подключения нету. Данные все лежат у немцев и на дисках они их больше никому не отправляют.
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39478123
Bettler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
seomoneystecdocru,
У Вас не база, а какой-то винегрет:
...
Если кому-то нужна нормальная мультиязычная база TecDoc 2017Q2 в MySQL формате, без дубликатов и непонятных полей и со всеми изображениями, пишите ...

Для начала взглянуть бы на структуру базы без бла-бла-бла, те же "линковочные критерии авто к артиклям", как вы выражаетесь.
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39483370
asunny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обясните логику как новый текдок сложить в ЦСВ... ПЛИЗ.
Знаком с SQL и C#.
С текдоком опыта не имею.

asunny собака mail.ru
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39503022
tecdocru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По многочисленным просьбам, выводим на рынок новый продукт - TECDOC.RU OEM2CAR. Очень многим нужно определять на какие автомобили подходит та или иная запчасть, и большинство из этих людей, не готовы заморачиваться с построением запросов к TECDOC, да и самой покупке целой системы, ради одной только функции.

OEM2CAR - это mySQL таблица, которая простым запросом к ней выдает применяемость оригинального номера.

Как это работает на практике, Вы можете потестировать на бесплатном API: http://api.tecdoc.ru/oemcars/0446560330 , замените 0446560330 на любой OEM-номер и система выдаст применяемость в JSON-формате.

Сама таблица весит около 400Мб в формате SQL. В ZIP-архиве - 17Мб.

Сейчас проект OEM2CAR находится в режиме тестирования, поэтому отнеситесь с пониманием, если вдруг чего-то не будет хватать.

Стоимость OEM2CAR.SQL составляет 5 000 руб. Готовы ответить на все Ваши вопросы: info@tecdoc.ru
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39685626
xtd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tecdocru,

Отвечаете вы ооочень "быстро"... Купил у вас версию 1Q2018 и запрос по аналогам-заменителям теперь выполняется в пять раз дольше чем в версии 3Q2017! Напрасно потраченные деньги! А вы так и НЕ отвечаете!
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39686525
tecdocru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вчера ответ прислал со скриншотами! Как я и говорил, проблема не в базе, а в чем-то другом.

Потратил полдня, чтобы развернуть 3Q2017 и запустить указанный Вами запрос.

У меня его выполнение на 3Q2017 заняло 0.435сек , и выдало 32 записи.
https://ibb.co/hQRcvp][img] https://preview.ibb.co/d35sT9/image.png [/img]

Запустил тот же запрос в 1Q2018 . Его выполнение заняло 0.216сек и выдало 34 записи.
https://ibb.co/cezagU][img] https://preview.ibb.co/bGqgMU/image_1.png [/img]

Либо у вас сервер mysql не настроен, либо вы после импорта не проанализировали все таблицы, чтобы индексы создались, либо железо у вас в принципе не заточено под базы такого уровня, либо вы вводите нас в заблуждение, чтобы и базу сохранить, и деньги вернуть. Я повторюсь, с базой все в порядке.
...
Рейтинг: 0 / 0
Новый TECDOC 2Q2017/3Q2017
    #39692231
xtd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tecdocru,

Ребята, очень советую не иметь дела с этим сайтом (tecdoc.ru). Как выяснилось, этот человек перепродает чужие данные. База у меня так и не заработала нормально, а вот угроз в свой адрес я уже получил достаточно. Толковой инструкции нет, сама база сделана через ж.

Проблема с этой базой не только у меня, почитайте на форуме: https://rutracker.org/forum/viewtopic.php?t=5600759
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Новый TECDOC 2Q2017/3Q2017
    #39865765
tecdocsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Представляю пользователям форума свой вариант базы данных экспортированной из DVD версии каталога не оригинальных авто зап. частей.
Экспортировано три версии каталога:
2Q2018 - последняя версия с русским языком(два варианта таблиц русский и английский)
4Q2018 - версия на английском языке
1Q2019 - версия на английском языке
на сайте tecdoc.h1n.ru Вы можете выполнять запросы на этих базах через интерфейс phpMyAdmin
На том же сайте опубликована более подробная информация и ссылки на скачивание demo версий баз.
Базы распространяются в CSV формате.
Каждая база комплектуется:
схемой базы для СУБД MySql (артикулам присвоены идентификаторы, связь с другими таблицами по ID, созданы нужные индексы)
скриптом для импорта из CSV через команду LOAD DATA LOCAL INFILE
примерами sql запросов, поясняющие структуру базы
архивом изображений товарных единиц
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Новый TECDOC 2Q2017/3Q2017
    #40057665
tecdocsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Представляю пользователям форума свой вариант базы данных экспортированной из DVD версии каталога не оригинальных авто зап. частей.
Экспортировано три версии каталога:
2Q2018 - последняя версия с русским языком(два варианта таблиц русский и английский)
4Q2018 - версия на английском языке
1Q2019 - версия на английском языке
на сайте http://tecdocsql.atwebpages.com Вы можете выполнять запросы на этих базах через интерфейс phpMyAdmin
На том же сайте опубликована более подробная информация и ссылки на скачивание demo версий баз.
Базы распространяются в CSV формате.
Каждая база комплектуется:
схемой базы для СУБД MySql (артикулам присвоены идентификаторы, связь с другими таблицами по ID, созданы нужные индексы)
скриптом для импорта из CSV через команду LOAD DATA LOCAL INFILE
примерами sql запросов, поясняющие структуру базы
архивом изображений товарных единиц
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / ERP и учетные системы [игнор отключен] [закрыт для гостей] / Новый TECDOC 2Q2017/3Q2017
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (8): Анонимы (4), Yandex Bot, Bing Bot 1 мин., RePredeclared 1 мин., Google Bot 8 мин.
x
x
Закрыть


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