FBA Toolkitãã¬ãŒã ã¯ãŒã¯ã®ç¥èãç¶ç¶ãã1Cçšã®Androidã¯ã©ã€ã¢ã³ããéçºããå¥ã®äŸãèããŠã¿ãŸãããã ã¢ããªã±ãŒã·ã§ã³ã販売åºã®ç£æ»ãã¯ã1Cãã蚪åã«ãŒããèªã¿èŸŒã¿ãå°å³ã«è¡šç€ºããŸãã ãªãã©ã€ã³ãããã¯ãOpenStreetMapãããã³ã°ãµãŒãã¹ã«åºã¥ããŠäœ¿çšãããŸãã
å¿ èŠãªãã¹ãŠã®éçºè ããŒã«ãæ¢ã«ã€ã³ã¹ããŒã«ããã³æ§æãããŠããããšãåæãšããŠããŸãã ããã§ãªãå Žåã¯ã åã®éšåãåç §ããŠãã ããã FBA Toolkitãã¬ãŒã ã¯ãŒã¯ã¯å°ãªããšãããŒãžã§ã³1.03ã§ãªããã°ãªããã1Cæ§æãšAndroidãããžã§ã¯ãru_profi1c_fbaãSVNãªããžããªããæŽæ°ããå¿ èŠããããŸãã
ãµãŒããŒéšåïŒ1CããŒã¿ããŒã¹å ïŒ
1.æ å ±ããŒã¹1Cã§ãããšãã°ããŒã¿ãœãŒã¹ãšããŠæ©èœãã2ã€ã®ãã£ã¬ã¯ããªãäœæããŸãã
ãã£ã¬ã¯ããªã販売åºãã®è©³çŽ°ïŒ
- ã緯床ããšãçµåºŠãã«ã¯ããã®ç¹ã®åº§æšã10.6ã®æ°å€ãå«ãŸããŸã
- ãªãã¡ã¬ã³ã¹ããã¯ãè¿œå æ å ±ã®ä¿åããžã®ãåçããªã³ã¯-ã¡ã€ã³ã€ã¡ãŒãžãžã®ãªã³ã¯ã
- æååã¿ã€ãã®ä»ã®ãã¹ãŠã®è©³çŽ°ã
ãã£ã¬ã¯ããªãè¿œå æ å ±ã®å庫ãã®è©³çŽ°ïŒ
- ã¿ã€ããDirectoryReference.Trade Pointããå«ãè€åã¿ã€ãã®ããªããžã§ã¯ããã¯ãè¿œå æ å ±ãå±ãããªããžã§ã¯ããå®çŸ©ããŸãã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯äœ¿çšãããŸããã
- ãã¹ãã¬ãŒãžããã¿ã€ããã¹ãã¬ãŒãžãã«ã¯ãã€ã¡ãŒãžèªäœãå«ãŸããŸãã
2.ãããã®2ã€ã®ãã£ã¬ã¯ããªã®ã¿ãå«ã亀æèšç»ãMobileAuditingPointsããè¿œå ãããå€æŽã®èªåç»é²ãå«ãŸããŸãã
3.ãªãã¡ã¬ã³ã¹ããã¯ã«ããã€ãã®ãã¹ãæ å ±ãå ¥åããŸãããã®äŸã§ã¯ãã¢ã¹ã¯ã¯ã®äžå¿éšã«ãããããã§ãªã¢ïŒãªãŒãã³ãœãŒã¹ããååŸããããŒã¿ïŒã§ãã
ããã€ãã®ãã€ã³ãã®ç»åãã¢ããããŒããããŠããŸãã ã¹ãã¬ãŒãžã«å€ãä¿åããããã®ã³ãŒãã¯1Cã®æšæºã§ãïŒ
= (); = (, (9));
ãã£ã¬ã¯ããªèŠçŽ ãAdditional Information StorageãããFileNameãã®åœ¢åŒã«ã¯ãããŒããããã€ã¡ãŒãžãžã®ãã¹ãå«ãŸããŸãã
4.ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãAudit of a POSããäœæããŸãã ãã£ã¬ã¯ããªãã¡ã¿ããŒã¿ããªãŒã«è¿œå ããŸãã
䟿å®äžãã©ãã³ã¢ã«ãã¡ãããã®è©³çŽ°åãšãªããžã§ã¯ãã®ååã¯è±èªã«ç¿»èš³ãããŠããŸãã
亀æã¹ããŒã ã¯ã1Cã§å€æŽããããªããžã§ã¯ãã®ã¿ãã¢ããããŒãããããã«æ§æãããŸãã
- MobileAuditingPoints Exchangeã¢ããªã±ãŒã·ã§ã³ãã©ã³ã䜿çšããããã®ãã©ã°ãèšå®ãããŠãã
- 1Cã§ã販売æç¹æ å ±ããå€æŽãããšãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«è»¢éãããŸãã
- ãè¿œå æ å ±ã®å庫ããã£ã¬ã¯ããªã«è¿œå ã®ãã£ã«ã¿ãªã³ã°ãé©çšãããŠããŸããå€æŽãããæ å ±ãã¢ãŠãã¬ããã«ã®ã¿è»¢éããŸãã ããã¯ãªã¯ãšã¹ãã«ãã£ãŠè¡ãããŸãïŒ
. .. . = & .. .
ããã§ããExchange Nodeãã¯äºåå®çŸ©ããããã©ã¡ãŒã¿ãŒã§ããã亀ææã«ã¯ã¢ãã€ã«åŸæ¥å¡ã®ã€ã³ã¹ããŒã«æžã¿ããŒãã®å€ãå«ãŸããŸãïŒä»¥äžã«ã€ã³ã¹ããŒã«å ã瀺ããŸãïŒã
5. Androidã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã¬ãŒããçæããŸãã ã©ã€ã»ã³ã¹ãååŸããããã®ã³ã¹ããšæé ã¯ã ããã§èª¬æãããŠããŸã ã åä¿¡ããã©ã€ã»ã³ã¹ããŒã¿ã1Cã«å ¥åããæ¹æ³ã¯ã ããã«èšèŒãããŠããŸã ã
ãã¹ãã©ã€ã»ã³ã¹ã䜿çšããããšãã§ããŸãã
client_idïŒTEST-CLIENT-000
client_nameïŒãã¹ãã¯ã©ã€ã¢ã³ãå
client_pwdïŒ31qX9OqZ_V
lisence_idïŒf7a42162-e27f-4246-a89b-b69c02387740
ãã®å Žåã«ã®ã¿ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã®ååãå€æŽããããšã¯ãå§ãããŸããïŒ ru.profi1c.samples.audit.salespoint ã
6.ãã£ã¬ã¯ããªãã¢ãã€ã«åŸæ¥å¡ãã«ã亀æã®ãã¹ãã«äœ¿çšãããåŸæ¥å¡çšã®ã¢ããªã±ãŒã·ã§ã³ãè¿œå ããŸãã ãExchangeããŒããåã«æ³šæããŠãã ãããããã¯äº€æèšç»ã®æ°ããèŠçŽ ã§ãã
ååãšããŠã亀æããŒãã¯åŸæ¥å¡ããšã«äœæãããŸãã ãã®å Žåã1Cã§ã®ããŒã¿å€æŽã¯ãã¹ãŠã®ããŒãïŒãã¹ãŠã®ã¢ãã€ã«åŸæ¥å¡ïŒã«å¯ŸããŠèªåçã«èšé²ããã亀æäžã«åã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã¯ãããŒã¿ã®äžéšãååŸãããŸãã
ãã®ãã©ã¡ãŒã¿ãŒã¯ããªãã¡ã¬ã³ã¹ããã¯ãè¿œå æ å ±ã®ã¹ãã¬ãŒãžãã®å Žåã®ããã«ãããŒã¿ååŸãªã¯ãšã¹ãã§äœ¿çšã§ããŸãã
ãŸããæ··ä¹±ãæããªãããã«ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ããšã«åå¥ã®äº€æèšç»ãäœæããããšããå§ãããŸãã
1Cã®æºåäœæ¥ãå®äºããŸããã亀æã«ãŒã«ããã¹ãããããã«ããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšãã亀æãã¹ããã®åŠçã䜿çšã§ããŸã ã詳现ã¯ãã¡ã ã 1Cã§ã¯ãä»ã«äœãããå¿ èŠã¯ãããŸãããFBAã®äº€æãçµç¹ãããã¹ãŠã®æ¥åžžæ¥åãåŒãåããããŸãã ããã°ã©ããŒã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã«éäžã§ããŸãã
Androidã¢ãã€ã«ã¢ããª
1.çæããããã³ãã¬ãŒãã«åºã¥ããŠæ°ãããããžã§ã¯ããäœæããŸãã ãããè¡ãã«ã¯ãEclipseã«ã€ã³ããŒãããå¿ èŠããããŸãïŒè©³çŽ°ã¯ãã¡ãïŒ ã
2.ããããåŠçããŸãããã FBAã«ã¯ãåå¿è ããªãã©ã€ã³ã®Mapsforgeããããç°¡åã«æäœã§ããããã«ããè£å©ã¯ã©ã¹ãå«ãŸããŠããŸãã ãããã®ã¯ã©ã¹ã®1ã€ã¯ããŠã§ã€ãã€ã³ãã衚瀺ããŠããã²ãŒãããããã«èšèšãããã¢ã¯ãã£ããã£ã§ããBaseRouteMapActivityã§ãã ããã䜿çšããŸãã
2.1 BaseRouteMapActivityããç¶æ¿ããç¬èªã®ã¯ã©ã¹ãäœæããŸãã
ã·ã§ãŒ
public class MapsforgeRouteMap extends BaseRouteMapActivity { /* * ( ) * */ public static int DEF_LOCATION_MIN_DISTANCE = 500; /* * , , * . */ public static long DEF_LOCATION_MIN_TIME = 5000 * 60; //, private static final double DEFAULT_GEOPOINT_LAT = 55.755831; private static final double DEFAULT_GEOPOINT_LNG = 37.617673; // private static final String MAP_FILE = "ru_moscow.map"; private MapView mMapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_route_map); init(); } private void init() { mMapView = (MapView) findViewById(R.id.mapView); // onCreateMapView(mMapView); } @Override public File getMapFile() { return new File(getAppSettings().getBuckupDir(),MAP_FILE); } @Override public GeoPoint getMapCenterPoint() { return MapHelper.toGeoPoint(DEFAULT_GEOPOINT_LAT, DEFAULT_GEOPOINT_LNG); } @Override public int getLocationMinDistance() { return DEF_LOCATION_MIN_DISTANCE; } @Override public long getLocationMinTime() { return DEF_LOCATION_MIN_TIME; } @Override public boolean showCurrentPosition() { return true; } @Override public boolean requestLocationUpdates() { return true; } @Override protected void onRouteItemSelect(RouteOverlayItem<?> item) { } @Override public void onLocationChanged(Location location) { } }
ã¢ã¹ã¯ã¯ã®ãããã衚瀺ããŸããããã¯ããšãã¥ã¬ãŒã¿ãŒã®mnt / sdcard / backup / <package name>ãã£ã¬ã¯ããªãŒã«é 眮ããå¿ èŠããããŸãã ãã®ãã£ã¬ã¯ããªã¯ãããã°ã©ã ãæåã«èµ·åãããšãã«èªåçã«äœæãããŸãã ããããã¡ã€ã«ã®å ¥æå ãŸãã¯èªåã§äœæããæ¹æ³ã«ã€ããŠã¯ãèšäºã®æåŸãåç §ããŠãã ããã
èµ·åæã«ãå°å³ã¯getMapCenterPointïŒïŒã¡ãœããã§æž¡ããã座æšãäžå¿ãšããŸãã çŸåšã®äœçœ®ã§ããŒã«ãŒã衚瀺ããå ŽåãshowCurrentPositionïŒïŒé¢æ°ã¯trueãè¿ãå¿ èŠããããŸãã
requestLocationUpdatesïŒïŒã¡ãœããã䜿çšããŠåº§æšè¿œè·¡ãæå¹ã«ãªã£ãŠããå ŽåãonLocationChangedã¯å€æŽæã«åŒã³åºãããŸãã 座æšæŽæ°é »åºŠã®èšå®ã¯ãgetLocationMinDistanceïŒïŒããã³getLocationMinTimeïŒïŒãä»ããŠèšå®ãããŸãã ããã©ã«ãã§ã¯ãäž¡æ¹ã®ãããã€ããŒïŒGPSããã³NETWORKïŒã䜿çšããŠåº§æšãååŸããŸãããœãŒã¹ã³ãŒããéããŠãããããBaseMapActivityã§å€æŽã§ããŸãã
ã¬ã€ã¢ãŠãactivity_route_map.xmlã§ããããèŠçŽ ãé 眮ããŸãã
<org.mapsforge.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" > </org.mapsforge.android.maps.MapView>
åºæ¬çã«ãããã¯å°å³ã衚瀺ããã®ã«ååã§ãã ãŸããçŸåšäœçœ®ã®ããŒã«ãŒãå°å³äžã«è¡šç€ºããã座æšãå€åãããšãã«ã€ãã³ããåŠçããããšãã§ããŸãã
2.2ã«ãŒããã€ã³ããå«ãã¬ã€ã€ãŒã®è¿œå ã¯ãaddRouteOverlayã¡ãœããã䜿çšããŠå®è¡ãããŸãããã®ã¡ãœããã«ã¯ããªã¹ã<RouteOverlayItem>èŠçŽ ã®ãªã¹ããæž¡ãããŸãã Tã¯è¿œå ã®ã¿ã€ãã§ãã ã¢ã€ãã ãšãšãã«ä¿åãããããŒã¿ãããªãã®å Žåã¯CatalogSalesPointã§ãã ã¢ãŠãã¬ããã®ãªã¹ããäœæããŸãã
ã·ã§ãŒ
private void initDummyRoute() throws SQLException { //DAO mStorageDao = new CatalogAddInfoStorageDao(getConnectionSource()); mSalesPointDao = new CatalogSalesPointDao(getConnectionSource()); // CatalogSalesPointDao salePointDao = new CatalogSalesPointDao(getConnectionSource()); List<CatalogSalesPoint> lst = salePointDao.select(); // routeItems = new ArrayList<RouteOverlayItem<CatalogSalesPoint>>(); // , final double lng = DEFAULT_GEOPOINT_LNG; double lat = DEFAULT_GEOPOINT_LAT; int count = lst.size(); for (int i = 0; i < count; i++) { CatalogSalesPoint salesPoint = lst.get(i); boolean movable = (salesPoint.lat == 0 || salesPoint.lng == 0); int resIdDrawable = R.drawable.fba_map_maker_green; GeoPoint geoPoint = new GeoPoint(salesPoint.lat, salesPoint.lng); if (movable) { resIdDrawable = R.drawable.fba_map_marker_red; lat -= 0.003f; geoPoint = new GeoPoint(lat, lng); } // Drawable marker = MapHelper.makeNumberedMarker(this, resIdDrawable,i + 1); RouteOverlayItem<CatalogSalesPoint> routePoint = new RouteOverlayItem<CatalogSalesPoint>( geoPoint, marker, salesPoint); routePoint.setMovable(movable); routePoint.setOrdinal(i + 1); routeItems.add(routePoint); } Drawable defaultMarker = getResources().getDrawable(R.drawable.fba_map_marker_orange); addRouteOverlay(mMapView, routeItems, defaultMarker); }
ãããŠãinitïŒïŒã§ãã®ã¡ãœãããžã®åŒã³åºããè¿œå ããŸãã
ããã§ã¯ãããŒã«ã«ããŒã¿ããŒã¹ããããSales Pointsããã£ã¬ã¯ããªã®ãã¹ãŠã®èŠçŽ ãéžæããã衚瀺ãããèŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ã«è¿œå ãããŸãã ããã«ã座æšã1Cã«èšå®ãããŠãããã€ã³ãã®å ŽåãããŒã«ãŒã¯ç·è²ã«ãªããŸãã 座æšã®ãªããã€ã³ãã¯ããããã®äžå¿ã«èµ€ãããŒã«ãŒã§é 眮ãããŸãã ãŠãŒã¶ãŒã¯ã座æšãæ確ã«ããããã«ããããäžã§ãããã移åã§ããŸãã
2.3 onRouteItemSelectãã³ãã©ãŒå ã®ããŒã«ãŒã®ã¯ãªãã¯ã«å¯Ÿããå¿çãè¿œå ããŸãããã
CatalogSalesPoint salesPoint = (CatalogSalesPoint) item.getData(); inflatePopup(salesPoint);
ã¢ãŠãã¬ããã«é¢ããè¿œå æ å ±ã衚瀺ããã¯ã©ã¹ãã£ãŒã«ããšã¡ãœããïŒ
ã·ã§ãŒ
private ObjectView mSalesPointView, mFotoStorageView; /* * ( ) */ private static String[] fields = new String[] { CatalogSalesPoint.FIELD_NAME_DESCRIPTION, CatalogSalesPoint.FIELD_NAME_ADRESS, CatalogSalesPoint.FIELD_NAME_PHONE, CatalogSalesPoint.FIELD_NAME_SITE }; /* * view- */ private static int[] ids = new int[] { R.id.tvDescription, R.id.tvAdress, R.id.tvPhone, R.id.tvSite}; /* * */ private void inflatePopup(CatalogSalesPoint salesPoint) throws SQLException { if (CatalogSalesPoint.isEmpty(salesPoint.foto)) { mFotoStorageView.setVisibility(View.GONE); } else { // mStorageDao.refresh(salesPoint.foto); mFotoStorageView.build(salesPoint.foto, getHelper(), new String[] { CatalogAddInfoStorage.FIELD_NAME_STORAGE }, new int[] { R.id.ivFoto }); mFotoStorageView.setVisibility(View.VISIBLE); } mSalesPointView.build(salesPoint, getHelper(), fields, ids); }
ãããã¢ãããŠã£ã³ããŠã衚瀺ããã«ã¯ãmap_popup.xmlã¬ã€ã¢ãŠãã䜿çšããŸãïŒããŒã¯ã¢ããã¯éšåçã«è¡šç€ºãããŸãïŒã
<ru.profi1c.engine.widget.ObjectView android:id="@+id/ovSalesPoint"> <ru.profi1c.engine.widget.ObjectView android:id="@+id/ovFotoStorage" > <ImageView android:id="@+id/ivFoto"/> </ru.profi1c.engine.widget.ObjectView> <TextView android:id="@+id/tvDescription"/> <TextView android:id="@+id/tvAdress"/> <TextView android:id="@+id/tvSite" android:autoLink="web"/> <TextView android:id="@+id/tvPhone" android:autoLink="phone"/> </ru.profi1c.engine.widget.ObjectView>
ã¬ã€ã¢ãŠãã«ã¯1ã€ã®ã³ã³ã»ã³ãã«é¢ããæ å ±ã衚瀺ããã詳现ãååãããäœæããããµã€ãããããã³ãé»è©±ããmSalesPointView.buildïŒ...ïŒã® TextViewèŠçŽ ã«èªåçã«æ圱ãããŸã ã
åçã衚瀺ããã«ã¯ãåImageViewãæã€ovFotoStorageåŸå±ãªããžã§ã¯ãã䜿çšãããŸãã åçã¯ããŒã¿ããŒã¹ããèªã¿åããã mFotoStorageView.buildïŒ...ïŒã¡ãœããã§ImageViewã«æ圱ãããŸãã
ãŸãããåçãå±æ§ã«ã¯ãè¿œå æ å ±ã¹ãã¬ãŒãžããã£ã¬ã¯ããªãžã®ãªã³ã¯ã®ã¿ãæ ŒçŽããããããæåã«ãªãã¬ãã·ã¥ã¡ãœããã§èªã¿åãå¿ èŠããããŸãã
åæåã¯initïŒïŒã®ã¡ãœããã«è¿œå ãããŸã
mSalesPointView = (ObjectView) findViewById(R.id.ovSalesPoint); mFotoStorageView = (ObjectView) findViewById(R.id.ovFotoStorage);
map_popup.xmlã¬ã€ã¢ãŠãã¯Toastã®ã«ã¹ã¿ã ãšããŠèšå®ã§ããŸããããã®äŸã§ã¯ã¡ã€ã³ã®activity_route_map.xmlã¬ã€ã¢ãŠãã«çµã¿èŸŒãŸããŠããŸãã
ã·ã§ãŒ
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <org.mapsforge.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" > </org.mapsforge.android.maps.MapView> <include android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" layout="@layout/map_popup" android:visibility="gone" /> </FrameLayout>
次ã®ã¡ãœããã䜿çšããŠãå¯èŠæ§ãå¶åŸ¡ããŸãã
ã·ã§ãŒ
/* * */ private void closePopup(){ if(mSalesPointView.getVisibility() == View.VISIBLE){ mSalesPointView.setVisibility(View.GONE); } } /* * */ private void showPopup(){ if(mSalesPointView.getVisibility() != View.VISIBLE){ mSalesPointView.setVisibility(View.VISIBLE); } }
ãããã¢ããã¡ãã»ãŒãžã¯ãã¯ãªãã¯ãããšé衚瀺ã«ãªãããã€ã³ãããŒã«ãŒãã¯ãªãã¯ãããšè¡šç€ºãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®æºåãã§ãããããšãã¥ã¬ãŒã¿ã§å®è¡ããèªèšŒãã©ã¡ãŒã¿ãŒãæ§æããŠïŒ1Cã®ããã«ïŒããŒã¿ããŒã¹ãšäº€æããŸãã é©çšäŸïŒ
é»è©±çªå·ãã¯ãªãã¯ãããšãæšæºã®ããã€ã€ã©ãŒããéãããªã³ã¯ãã¯ãªãã¯ãããšãã©ãŠã¶ãŒãèµ·åããŸãã ãã®åäœã¯ãTextViewã®androidïŒautoLinkããããã£ãèšå®ããã ãã§å®çŸãããŸãã
å®å šãªãµã³ãã«ã³ãŒãã¯SVN ãªããžããªã«ãããŸã ã ããã«ã移åãããã€ã³ãã®åº§æšãä¿åããããŒã«ãŒãæŽæ°ããæ¹æ³ã瀺ããŸãã
ã«ãŒãã®å ¥æå
GoogleããããšFBAã¯ã©ã€ã¢ã³ãåãã«äœæããããããã®è©³çŽ°ãæããã«ãªã£ãŠããéœåžïŒå°åïŒãåªå ããŠããŠã§ããµã€ãã«ããã€ãã®ããããé 眮ããäºå®ã§ãã ããããã¡ã€ã«ã®äœæã«é¢ããç°¡åãªæé ãèšèŒãããŠããŸãã
ããã ãã§ããä»ã®äŸã§ã¯ããµã€ãhttp://profi1c.ruã§èŠã€ããããšãã§ããŸãã
ã¢ãã€ã«ããžãã¹ã¢ããªã±ãŒã·ã§ã³ã®éçºã¯ãé£ãããé«äŸ¡ã§ãé·ãããšããç¥è©±ãææã§ããããšãé¡ã£ãŠããŸãã